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