并发Powershell作业未运行命令

时间:2015-03-18 20:46:52

标签: multithreading powershell concurrency server

嘿家伙第一次做海报长时间读者,我现在对我的脚本有点麻烦,并希望有人会检查出来并指出我出错的地方,如下:< / p>

$Servers = gc "C:\ServerList.txt"
 $SB = {
    Start-Process {cmd (C:\psexec.exe \\$Server -u username -p password cmd /c "echo.| powershell C:\Autolog.ps1")
       }
Foreach ($Server in $Servers) 
    {
    Start-Job -ScriptBlock $SB
    }

基本上我正在尝试让这个脚本做的是“Serverslist.txt”中的每个服务器启动一个PSEXEC,然后在所述服务器上启动一个Powershell脚本

我所看到的是工作开始,但我的psexec没有在服务器上触发,我知道这条线很好,因为我已完成对该命令的隔离测试并手动触发它

注意:删除目录和凭据以保护隐私

3 个答案:

答案 0 :(得分:0)

这可能比它需要的更复杂。我会针对该计算机列表运行一个脚本块,而不是这样:

$cred = New-Object System.Management.Automation.PSCredential ("domain\username",(ConvertTo-SecureString 'password' -asplaintext -force))
foreach ($server in $servers) {
    Invoke-Command -ComputerName $comp -ScriptBlock {. C:\Autolog.ps1} -Credential $cred
}

答案 1 :(得分:0)

您的工作不知道$Server的含义,因为作业在自己的流程中运行,因此不会访问父流程的变量。你必须传递参数。试试这个:

Start-Job -ScriptBlock $SB -ArgumentList $Server

答案 2 :(得分:0)

感谢帮助最终解决它并让它做了想做的事情,脚本如下:

$Servers = gc "C:\ServerList.txt"
Foreach ($Server in $Servers) 
    {
    [String]$cmd = "& cmd (C:\psexec.exe \\$Server -u Username -p Password cmd /c C:\Autolog.bat)"
    [ScriptBlock]$SB = [ScriptBlock]::Create($cmd)
    Start-Job -ScriptBlock $SB -ArgumentList $Server
    echo "Started Script on $Server"
    }

我不得不将一些命令移到.bat,因为我没有时间解决问题,但我基本上是C:\ Autolog.bat包含“powershell.exe C:\ Autolog.ps1 “从第一个脚本帖子