Multithreading 并发Powershell作业未运行命令

Multithreading 并发Powershell作业未运行命令,multithreading,powershell,concurrency,server,Multithreading,Powershell,Concurrency,Server,嘿,伙计们,第一次海报长期读者,我现在的剧本有点麻烦,希望有人能检查一下,指出我哪里出了问题,如下所示: $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)

嘿,伙计们,第一次海报长期读者,我现在的剧本有点麻烦,希望有人能检查一下,指出我哪里出了问题,如下所示:

$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
    }
$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"
    }
基本上,我试图让这个脚本为“Serverslist.txt”中的每台服务器启动一个PSEXEC,然后在该服务器上启动一个Powershell脚本

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


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

这可能比需要的复杂得多。我将对该计算机列表运行脚本块,如下所示:

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

您的作业不知道
$Server
意味着什么,因为作业在自己的进程中运行,因此不访问父进程的变量。你必须通过辩论。试试这个:


启动作业-ScriptBlock$SB-ArgumentList$Server

感谢您的帮助最终完成了任务,并让它做了自己想做的事情,脚本如下:

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

谢谢你的回复Paul,这是否假设powershell远程访问已启用?我忘了说它不是。另外,我对powershell不是很熟练,这是一个边学边做的东西。干杯,MichaelYou是正确的,powershell远程处理需要启用。有没有什么特别的原因?这是非常快速和容易设置;在目标服务器上:
启用PsRemoting-force
然后
winrm quickconfig
,因为这里有1000台服务器,我没有权限进行所需的更改。很遗憾,我尝试使用PSEXEC,尽管这两台服务器显然彼此有问题