远程命令输出到文本文件(远程系统)

问题描述 投票:0回答:1

我知道我必须使用这些命令错误,但我似乎无法找到解决方案。我相信问题在于我使用了invoke-command和out-file。我正在尝试检查进程是否在多个远程计算机上运行,​​并将其状态写回主机系统上的文本文件。即使它写入远程系统我也可以使用它但我似乎无法得到任何东西。

$MyDomain=’mydomain’
$MyClearTextUsername=’myusername’ 
$MyClearTextPassword=’mypassword’
$MyUsernameDomain=$MyDomain+’\’+$MyClearTextUsername
$SecurePassword=Convertto-SecureString –String $MyClearTextPassword 
    -AsPlainText –force
$MyCredentials=New-object System.Management.Automation.PSCredential 
$MyUsernameDomain,$SecurePassword
$Servers = ( "server1","server2","server3")

$output = foreach ($Server in $Servers)
{
$Session = New-PSSession -ComputerName $Server -Credential $MyCredentials
Invoke-Command -Session $Session -ScriptBlock 
{
    Get-Service -Name service | select name, status, PSComputername, Runspaceid 
} | Out-File -filepath 'c:\TEMP\check.txt'
}
Write-output $output | Out-File -filepath 'c:\TEMP\check.txt'

编辑:我不相信最后一行是必要的,但我扔了它只是为了看看我能不能得到任何东西。

powershell
1个回答
0
投票

你没有在$output捕获任何东西,因为你正在将你的Invoke-Command的所有输出重定向到Out-File -filepath 'c:\TEMP\check.txt'Get-Service没有返回那么多数据,特别是当它从远程会话返回时被反序列化,所以我不打扰Select语句。即使你确实想要包含Select语句,你指定的PSComputerName在数据从远程系统返回之​​前不会被添加,所以你可能想要将Select移动到scriptblock之外和管道中的Invoke-Command之后。另外,由于您使用Out-File输出,每次调用时都会覆盖本地文件,因此保存第一个服务器的结果,然后由第二个服务器的结果覆盖,然后由第三个服务器的结果覆盖。之后,由于$output没有任何内容(因为所有输出都被重定向到文件),您正在向同一个文件输出一个空变量,从而有效地删除第三个服务器的服务状态。

但是,如果脚本使用可访问远程服务器的凭据运行,那么这一切都变得没有实际意义。您可以为Get-Service cmdlet指定一个或多个计算机名称,因此这可能变得如此简单:

$Results = Get-Service Service -ComputerName 'Server1','Server2','Server3'
$Results | Select name, status, PSComputername, Runspaceid | Set-Content 'C:\TEMP\check.txt'

只是为了确保......你正在寻找一项服务吗?不只是一个过程?因为如果它不是服务,你需要使用Get-Process而不是Get-Service

如果要将数据输出到远程服务器,可以执行以下操作:

$output = foreach ($Server in $Servers)
{
$Session = New-PSSession -ComputerName $Server -Credential $MyCredentials
Invoke-Command -Session $Session -ScriptBlock 
{
    Get-Service -Name service | Tee-Object -FilePath C:\Temp\ServiceState.txt
} | select name, status, PSComputername, Runspaceid 
}
$output | Out-File -filepath 'c:\TEMP\check.txt'

这应该在每个服务器上的C:\ Temp文件夹中创建一个具有服务状态的文件,并将信息传递回本地主机,然后传递给Select并存储在$output中。最后我将$output输出到文件,就像你一样。

我想最后你可以从你的循环中删除Out-File调用,它可能会做你想要的。

© www.soinside.com 2019 - 2024. All rights reserved.