PowerShell向Start-JOB传递变量

wlp8pajw  于 2022-11-10  发布在  Shell
关注(0)|答案(3)|浏览(167)

在PowerShell中,我想了解将变量调用到启动作业的最佳方式,这样我就不必为每个服务器编辑脚本,因为它将基于我放置脚本的客户端而具体。

$Servername = 'Server1'
    $pingblock = {
      pathping $servername | Out-File C:\client\PS\ServerPing.TXT
    }
    start-job $pingblock

当我运行上面的代码时,我只是得到一个带有帮助的文件,就好像我忘记了指定$servername一样。

s4n0splo

s4n0splo1#

Start-Job上使用-ArgumentList参数,例如:

Start-Job -Scriptblock {param($p) "`$p is $p"} -Arg 'Server1'

在您的案例中:

$pingblock = {param($servername) pathping $servername | Out-File C:\...\ServerPing.txt}
Start-Job $pingblock -Arg Server1
qni6mghb

qni6mghb2#

使用PSv3+替代方案补充Keith Hill's helpful answer

$using:作用域修饰符可用于引用传递给Start-Job的脚本块内调用者作用域中的变量值,作为传递参数的替代方法(默认情况下,作为后台作业执行的脚本块看到调用者的任何变量或其他定义):

$Servername = 'Server1'
Start-Job { "Target: " + $using:ServerName } | Receive-Job -Wait -AutoRemoveJob

上述收益:

Target: Server1

注:

  • 同样的技术可用于:
  • Invoke-Command用于远程执行-参见this question
  • Start-ThreadJob,(默认)在PowerShell(Core)v6+中提供
  • ForEach-Object -Parallel,在PowerShell(Core)v7+中提供
  • 请注意,与-ArgumentList一样,传递的只是变量,而不是变量本身;也就是说,您不能以这种方式修改调用方的变量。[1]

[1]然而,基于线程的并发特性-Start-ThreadJobForEach-Object Parallel-允许间接修改,即如果手头的变量值恰好是(可变的).NET引用类型的示例,例如哈希表。请注意,利用这一点可能需要额外的、非常重要的工作来使并发修改线程安全

qojgxg4l

qojgxg4l3#

还有一些其他方式,即$args和$input。这也适用于Invoke-Command,我认为它使用了相同的机制。$INPUT方法以一种意想不到的方式处理数组。

start-job { $args[0] } -args hi | receive-job -wait -auto
hi

echo hi | start-job { $input } | receive-job -wait -auto
hi

echo hi there | start-job { $input.gettype() } | receive-job -wait -auto

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
False    False    <GetReadEnumerator>d__20                 System.Object

对于数组,使用Foreach-Object(%)循环可能更好,这样它就可以在每个数组项上并行运行。另请参阅Powershell7中的启动-线程作业或Foreach-对象-并行。实际上,启动-作业没有-throttllimit选项,因此请谨慎使用。

echo yahoo.com facebook.com |
   % { $_ | start-job { test-netconnection $input } } |
   receive-job -wait -auto | select * -exclude runspaceid,pssourcejob* | ft

ComputerName RemoteAddress ResolvedAddresses PingSucce
                                             eded
------------ ------------- ----------------- ---------
yahoo.com    74.6.143.25   {74.6.143.25,...} True
facebook.com 31.13.71.36   {31.13.71.36}     True

相关问题