0

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

$用户名 = "用户"

$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 或调用命令,因为它在我们的环境中受到限制。

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

 + CategoryInfo          : NotSpecified: (:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError
 
PsExec v1.98 - Execute processes remotely
Copyright (C) 2001-2010 Mark Russinovich
Sysinternals - www.sysinternals.com
4

1 回答 1

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 块来命名您的变量,它实质上将传递的参数位置映射到命名变量中。

$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
}

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

于 2014-07-14T11:14:06.003 回答