Powershell 如何使用Invoke parallel调用下面的脚本块
这个调用并行是从 下面是我的脚本块Powershell 如何使用Invoke parallel调用下面的脚本块,powershell,Powershell,这个调用并行是从 下面是我的脚本块 $scriptblock ={ get-service -ComputerName $parameter.computername | where {$_.name -eq $parameter.serviceName } } 下面是一个自定义对象 $pscustomobject = @() $pscustomobject += [pscustomobject]@{ Computername ='server1' Servicename ="se
$scriptblock ={
get-service -ComputerName $parameter.computername | where {$_.name -eq $parameter.serviceName }
}
下面是一个自定义对象
$pscustomobject = @()
$pscustomobject += [pscustomobject]@{
Computername ='server1'
Servicename ="service1"
}
$pscustomobject += [pscustomobject]@{
Computername ='server2'
Servicename ="service2"
}
我尝试使用下面的方法调用并行,但这不起作用
Invoke-Parallel -ScriptBlock $scriptblock -Parameter $pscustomobject
"server1","server2" | Invoke-Parallel -ScriptBlock $scriptblock -Parameter $pscustomobject
很少有服务存在于少数服务器上,也很少有其他服务器上,所以创建了一个自定义对象,将服务紧密地映射到服务器
任何想法都会非常有用使用
-Parameter
开关,脚本块中的每个项目都可以使用属性。我认为如果你做一个像这样的小修改,那么它应该可以工作:
$scriptblock ={
$thisServer = $_
$thisServerParams = $parameter.Where({$_.Computername -eq $thisServer})
get-service -ComputerName $thisServerParams.computername | where {$_.name -eq $thisServerParams.serviceName }
}
我们可以使用上面的代码找到每个服务器应该使用的正确属性。在前面的代码中,我们有效地使用了Invoke Parallel
每次在所有服务器上运行相同的命令。而且逻辑对于Where
块中的匹配服务不起作用,因为它将计算为
$pscustomobject.ServiceName
service1
service2
PS C:\Users\Stephen> $pscustomobject.ServiceName.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
从
Get service
返回的单个服务将永远不会等于System.Array使用-Parameter
开关,脚本块中的每个项目都可以使用属性。我认为如果你做一个像这样的小修改,那么它应该可以工作:
$scriptblock ={
$thisServer = $_
$thisServerParams = $parameter.Where({$_.Computername -eq $thisServer})
get-service -ComputerName $thisServerParams.computername | where {$_.name -eq $thisServerParams.serviceName }
}
我们可以使用上面的代码找到每个服务器应该使用的正确属性。在前面的代码中,我们有效地使用了Invoke Parallel
每次在所有服务器上运行相同的命令。而且逻辑对于Where
块中的匹配服务不起作用,因为它将计算为
$pscustomobject.ServiceName
service1
service2
PS C:\Users\Stephen> $pscustomobject.ServiceName.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
从
获取服务
返回的单个服务永远不会等同于系统。Array多亏了Foxdeploy,找到了实现我所需的另一种方法,下面的方法对我来说更灵活,因为..当我通过两个服务时,一个服务可能需要很多时间启动或停止,并且可能会保存另一个服务的数据
$pscustomobject | Invoke-Parallel -ScriptBlock {
$computername = $_.computername
$servicename = $_.servicename
get-service -ComputerName $($computername) | where {$_.name -eq $($serviceName) }
}
多亏了Foxdeploy,我又找到了一种实现所需的方法,下面的方法对我来说更灵活,因为..当我通过两个服务时,一个服务的启动或停止可能会花费很多时间,并且可能还会保存另一个服务的数据
$pscustomobject | Invoke-Parallel -ScriptBlock {
$computername = $_.computername
$servicename = $_.servicename
get-service -ComputerName $($computername) | where {$_.name -eq $($serviceName) }
}
我可能错了,但我相信使用内置Powershell cmdlet会更快,而且看起来更干净:
$servers=@(
'server1'
'server2'
)
$scriptblock={
switch($env:COMPUTERNAME)
{
'server1'{Get-Service service1}
'server2'{Get-Service service2}
}
}
$result=Invoke-Command -ComputerName $servers -ScriptBlock $scriptblock
编辑:
为了演示,我在这里等了10秒钟,然后根据7台服务器的名称在它们上面解出一个简单的数学方程,其中3对服务器以相同的名称开始。如果这是一个线性调用,那么它应该花费10+10+10+10秒,而所有调用只花费15秒。这表明您可以同时在不同的远程计算机上执行不同的命令
我可能错了,但我相信使用内置Powershell cmdlet会更快,而且看起来更干净:
$servers=@(
'server1'
'server2'
)
$scriptblock={
switch($env:COMPUTERNAME)
{
'server1'{Get-Service service1}
'server2'{Get-Service service2}
}
}
$result=Invoke-Command -ComputerName $servers -ScriptBlock $scriptblock
编辑:
为了演示,我在这里等了10秒钟,然后根据7台服务器的名称在它们上面解出一个简单的数学方程,其中3对服务器以相同的名称开始。如果这是一个线性调用,那么它应该花费10+10+10+10秒,而所有调用只花费15秒。这表明您可以同时在不同的远程计算机上执行不同的命令
看起来它应该会起作用,当你尝试它时会发生什么?它只是串行运行吗?这看起来像是在源系统上并行运行代码。你看过内置的
Invoke命令了吗?可以在目标上运行东西。。。因此是平行的。它可以运行得更快,因为它使用远程系统运行每个scriptblock,然后将结果发送到backSorry(我不知道),但是与ThreadJob模块相比,Invoke Parallel
有什么优势?或者为了在远程服务器上运行不同的命令,同时使用@Lee_Dailey指出的-AsJob
调用命令?它只是串行运行吗?这看起来像是在源系统上并行运行代码。你看过内置的Invoke命令了吗?可以在目标上运行东西。。。因此是平行的。它可以运行得更快,因为它使用远程系统运行每个scriptblock,然后将结果发送到backSorry(我不知道),但是与ThreadJob模块相比,Invoke Parallel
有什么优势?或者为了在远程服务器上运行不同的命令,正如@Lee_Dailey所指出的,同时使用调用命令和-AsJob
。是否需要删除$thisServer
周围的单引号?是否需要删除$thisServer
周围的单引号?除非使用-as job
,这些命令一次运行一台计算机参见示例7,不确定您在MS文档上读到了什么,但我非常确定这是完全可能的。如果有疑问,您可以查看我的编辑@游戏是战争除非你使用-作为作业
,否则这些命令一次只能运行一台计算机参见示例7不确定你在MS文档上读到了什么,但我很确定这是完全可能的。如果有疑问,您可以查看我的编辑@游戏就是战争