PowerShell远程会话和启动作业问题

PowerShell远程会话和启动作业问题,powershell,session,jobs,start-job,Powershell,Session,Jobs,Start Job,我试图用job运行以下脚本,但块中的代码只执行第一个命令并退出。作业在我的计算机上显示为“已完成” $computers = get-adcomputer -filter * | where { ($_.DNSHostName -match 'server')} foreach ($computer in $computers) { $session = New-PSSession -ComputerName $computer.DNSHostName Inv

我试图用job运行以下脚本,但块中的代码只执行第一个命令并退出。作业在我的计算机上显示为“已完成”

$computers = get-adcomputer -filter * | where { ($_.DNSHostName -match 'server')} 

foreach ($computer in $computers) {
        $session = New-PSSession -ComputerName $computer.DNSHostName
        Invoke-Command -Session $session -ScriptBlock {
            Stop-Service  W3SVC -Force
            Remove-Item "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root" -Force -Recurse
            Start-Service  W3SVC     
        } -asjob -jobname IIS_Maintenance
        Remove-PSSession -Session $session
}
如果我注释掉
-asjob-jobname IIS\u维护
作业运行良好,但它是同步的。它需要几秒钟来停止IIS,但我不知道为什么作业没有等待


想法?

创建会话会导致大量延迟。为什么选择使用
-Session
而不是直接使用
-ComputerName

我认为使用
-ComputerName
方式运行
启动作业
会更有效。无论哪种方式,由于您正在远程机器上调用作业,因此您的工作站将无法了解作业的进度


如果要跟踪作业的进度,则根本不应使用
Invoke命令。

创建会话会导致大量延迟。为什么选择使用
-Session
而不是直接使用
-ComputerName

我认为使用
-ComputerName
方式运行
启动作业
会更有效。无论哪种方式,由于您正在远程机器上调用作业,因此您的工作站将无法了解作业的进度


如果要跟踪作业的进度,根本不应该使用
Invoke命令。

好的,我想出来了。。。令人困惑的是:

1) 我不知道我可以在没有会话的情况下发送代码块,是的,会话实现很慢


2) 我也不知道我发送invoke命令给几台计算机都是一次没有foreach的。谢谢你,Ansgar Wiechers

好吧,我知道了。。。令人困惑的是:

1) 我不知道我可以在没有会话的情况下发送代码块,是的,会话实现很慢


2) 我也不知道我发送invoke命令给几台计算机都是一次没有foreach的。谢谢你,Ansgar Wiechers

Invoke命令-Computer$computers-ScriptBlock{…}-AsJob-JobName IIS_维护
?您只是想异步执行此操作吗?argghhh我刚刚注意到我输入了错误的代码,我开始尝试找出问题所在。。。正确的代码是:$session=New PSSession-ComputerName$computer.DNSHostName Invoke命令-session$session-ScriptBlock。。。。没有起始工作线。是的,我正在尝试以异步方式执行此操作,以便有X个并行作业。您可以使用更新的代码编辑原始帖子,而不是将代码以难以阅读的格式放入注释中。谢谢Jason,代码现在已编辑。
Invoke命令-Computer$computers-ScriptBlock{…}-AsJob-JobName IIS_Maintenance
?您只是想异步执行此操作吗?argghhh我刚注意到我输入了错误的代码,我开始尝试找出问题所在。。。正确的代码是:$session=New PSSession-ComputerName$computer.DNSHostName Invoke命令-session$session-ScriptBlock。。。。没有起始工作线。是的,我正在尝试以异步方式执行此操作,这样我可以有X个并行作业。您可以使用更新的代码编辑原始帖子,而不是将代码以难以阅读的格式放入注释中。谢谢Jason,代码现在已被编辑。使用会话的原因是我需要执行多个命令,因此打开会话、执行多个命令然后关闭会话似乎更有效。同样来自“在一个月的午餐中学习Powershell”一书:PS C:\>start job-scriptblock{invoke command-command{dir}➥-computername SERVER-R2}完全冗余;保留Invoke Command部分并使用-AsJob参数使其在后台运行。使用会话的原因是我需要执行多个命令,这样打开会话、执行多个命令然后关闭会话似乎更有效。同样来自“在一个月的午餐中学习Powershell”一书:PS C:\>start job-scriptblock{invoke command-command{dir}➥-computername SERVER-R2}完全冗余;保留Invoke命令部分并使用-AsJob参数使其在后台运行。