Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 如何使用Invoke parallel调用下面的脚本块_Powershell - Fatal编程技术网

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文档上读到了什么,但我很确定这是完全可能的。如果有疑问,您可以查看我的编辑@游戏就是战争