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

时间:2018-01-17 21:23:07

标签: powershell

我知道我必须使用这些命令,但我似乎无法找到解决方案。我相信问题在于我使用了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'

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

1 个答案:

答案 0 :(得分:0)

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

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

Get-Service

只是为了确保......您正在寻找服务吗?不只是一个过程?因为如果它不是服务,您需要使用$Results = Get-Service Service -ComputerName 'Server1','Server2','Server3' $Results | Select name, status, PSComputername, Runspaceid | Set-Content 'C:\TEMP\check.txt' 而不是Get-Process

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

Get-Service

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

我想最后你可以从你的循环中删除$output调用,它可能会按你想要的去做。