我知道我必须使用这些命令,但我似乎无法找到解决方案。我相信问题在于我使用了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'
编辑:我不相信最后一行是必要的,但我扔了它只是为了看看我能不能搞定任何东西。
答案 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
调用,它可能会按你想要的去做。