我正在尝试在远程服务器上执行现有脚本并在本地文件中捕获输出

时间:2014-06-05 08:14:30

标签: powershell powershell-v2.0 psexec start-job

我想在多台服务器(近40-50台服务器)上并行运行

$ Username =" user"

$Password = "Password"

$servers = get-content "c:\temp\servers.txt"

$sb = {c:\temp\PsExec.exe -h \\$server -u $Username -p $password cmd.exe /c "echo . | Powershell.exe -executionpolicy bypass -file c:\script.ps1" > "$env:userprofile\Desktop\output.txt"} 

foreach($server in $servers)
{
    start-job -ScriptBlock $sb
}

如果我删除了start-job,这段代码可以正常工作,但是一个接一个地执行,这需要花费很多时间。

我不能使用PSsession或invoke-command,因为它在我们的环境中受到限制。

此代码永不退出。它停在这个位置:

 + CategoryInfo          : NotSpecified: (:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

PsExec v1.98 - Execute processes remotely
Copyright (C) 2001-2010 Mark Russinovich
Sysinternals - www.sysinternals.com

1 个答案:

答案 0 :(得分:0)

首先,您不会将任何变量传递到作业中。你需要的是在ScriptBlock中使用$ args变量,然后使用-ArgumentList传递你想要的变量。

$Password = "Password"

$servers = get-content "c:\temp\servers.txt"

$sb = {
  c:\temp\PsExec.exe -h \\$args[0] -u $args[1] -p $args[2] cmd.exe /c "echo . | Powershell.exe -executionpolicy bypass -file c:\script.ps1" > "$args[3]\Desktop\output.txt"
} 

foreach($server in $servers)
{
    start-job -ScriptBlock $sb -ArgumentList $server,$Username,$password,$env:userprofile
}

我可能不需要传递环境变量,但看起来你对变量存在范围问题。

或者你可以在ScriptBlock中使用Param Block来命名你的变量,它实际上是在位置上映射传递给命名变量的Arguments。

$Password = "Password"

$servers = get-content "c:\temp\servers.txt"

$sb = {
  Param ($Server,$UserName,$Password,$UserProfile)

  c:\temp\PsExec.exe -h \\$Server -u $UserName -p $Password cmd.exe /c "echo . | Powershell.exe -executionpolicy bypass -file c:\script.ps1" > "$UserProfile\Desktop\output.txt"
} 

foreach($server in $servers)
{
    start-job -ScriptBlock $sb -ArgumentList $server,$Username,$password,$env:userprofile
}

我希望这会有所帮助。 干杯,克里斯。