PowerShell - 将变量传递给 Invioke 命令

PowerShell - Passing a variable to an Invioke-Command

出于某种原因,当我尝试在下面的代码中的 Get-ChildItem 之后使用 $scanpath 变量时,它不起作用。但是,如果我将实际路径放在 $scanpath 的位置,它就可以工作。我究竟做错了什么? $computer 和 $savepath 变量都工作正常。

$computer = 'Server'
$scanpath = 'P$\Directory\Directory\Z'
$savepath = 'C:\Z-Media.csv'
Invoke-Command -ComputerName $computer -scriptblock {Get-ChildItem $scanpath -recurse -include *.mp3,*.wma,*.wmv,*.mov,*.mpg,*.ogg,*.jpg -force | select FullName, Length | Sort-Object { [long]$_.Length } -descending} | Export-Csv $savepath -NoTypeInformation

$scanpath 与脚本块不在同一范围内。您有 2 种方法可以解决此问题:

PowerShell 3+ - Using 作用域修饰符

Invoke-Command -ComputerName $computer -scriptblock {Get-ChildItem $Using:scanpath -recurse}

有关详细信息,请参阅 about_Scopes

Using is a special scope modifier that identifies a local variable in a remote command. By default, variables in remote commands are assumed to be defined in the remote session.

任何版本 - 参数

Invoke-Command -ComputerName $computer -scriptblock {param($thisPath) Get-ChildItem $thisPath -recurse} -ArgumentList $scanpath

您可以给脚本块参数,就像函数一样。 Invoke-Command 采用 -ArgumentList 参数,将值传递到脚本块的参数中。