如何将ArrayList传递给远程机器上运行的Invoke-Command



我有一段代码,删除远程机器上所有用户配置文件的Google Chrome缓存。

为了实现这一点,我有函数GetMachineUserProfiles返回远程机器上所有用户配置文件的ArrayList。在其他功能中,我需要运行调用命令并循环使用$ListOfUserProfiles给出的所有用户配置文件,并删除每个配置文件的Chrome缓存。

但是我遇到了一个问题,$ListOfUserProfiles在我的调用命令中是空的/null。我尝试了几种解决方法,但每次都失败了。我的最后一次尝试显示在示例中:

$ListOfUserProfiles = GetMachineUserProfiles
$ListOfUserProfiles.count
Function Delete-Chrome-Temp-Files {
WriteLog "--------------------------------`n"
WriteLog "COMMAND: Delete Chrome temporary files"
$diskSpaceBeforeC = Disk-Free-Space
$ListOfUserProfiles.count
Invoke-Command -ComputerName $machine -ArgumentList (, $ListOfUserProfiles) -ScriptBlock {
$ListOfUserProfiles.count
foreach ($UserProfile in $ListOfUserProfiles){
Write-Host $UserProfile
Get-ChildItem -Path "C:Users"$UserProfile"AppDataLocalGoogleChromeUser Data" -Filter "*.tmp" | foreach { 
Remove-Item -Path $_.FullName 
WriteLog "INFO: Deleting $($_.FullName)"    
}
}
}
Delete-Chrome-Temp-Files

我的机器上有6个配置文件,你可以看到我在这里使用了3次count方法,它们返回:

6

60(这里我希望是6)

变量$ListOfUserProfiles只存在于您的本地作用域中-当您将$ListOfUserProfiles作为-ArgumentList的一部分传递时,PowerShell将该变量的传递给远程会话,但它不会重新创建变量本身。

要做到这一点,可以解引用相应的$args项:

Invoke-Command -ComputerName $machine -ArgumentList (, $ListOfUserProfiles) -ScriptBlock {
$ListOfUserProfiles = $args[0]
# ... rest of scripblock as before
}

…或者将它声明为一个位置参数,让PowerShell为你绑定这个值:

Invoke-Command -ComputerName $machine -ArgumentList (, $ListOfUserProfiles) -ScriptBlock {
param([System.Collections.ArrayList]$ListOfUserProfiles)
# ... rest of scripblock as before
}

相关内容

  • 没有找到相关文章

最新更新