在PowerShell中,我想了解将变量调用到启动作业的最佳方式,这样我就不必为每个服务器编辑脚本,因为它将基于我放置脚本的客户端而具体。
$Servername = 'Server1'
$pingblock = {
pathping $servername | Out-File C:\client\PS\ServerPing.TXT
}
start-job $pingblock
当我运行上面的代码时,我只是得到一个带有帮助的文件,就好像我忘记了指定$servername一样。
3条答案
按热度按时间s4n0splo1#
在
Start-Job
上使用-ArgumentList
参数,例如:在您的案例中:
qni6mghb2#
使用PSv3+替代方案补充Keith Hill's helpful answer:
$using:
作用域修饰符可用于引用传递给Start-Job
的脚本块内调用者作用域中的变量值,作为传递参数的替代方法(默认情况下,作为后台作业执行的脚本块不看到调用者的任何变量或其他定义):上述收益:
注:
Invoke-Command
用于远程执行-参见this question。Start-ThreadJob
,(默认)在PowerShell(Core)v6+中提供ForEach-Object -Parallel
,在PowerShell(Core)v7+中提供-ArgumentList
一样,传递的只是变量值,而不是变量本身;也就是说,您不能以这种方式修改调用方的变量。[1][1]然而,基于线程的并发特性-
Start-ThreadJob
和ForEach-Object Parallel
-允许间接修改,即如果手头的变量值恰好是(可变的).NET引用类型的示例,例如哈希表。请注意,利用这一点可能需要额外的、非常重要的工作来使并发修改线程安全。qojgxg4l3#
还有一些其他方式,即$args和$input。这也适用于Invoke-Command,我认为它使用了相同的机制。$INPUT方法以一种意想不到的方式处理数组。
对于数组,使用Foreach-Object(%)循环可能更好,这样它就可以在每个数组项上并行运行。另请参阅Powershell7中的启动-线程作业或Foreach-对象-并行。实际上,启动-作业没有-throttllimit选项,因此请谨慎使用。