如何将 ArrayList 传递给在远程计算机上运行的 Invoke-Command
How to pass ArrayList to Invoke-Command which runs on remote machine
我有一段代码可以删除远程机器上所有用户配置文件的 Google Chrome 缓存。
为了实现这一点,我使用了函数 GetMachineUserProfiles,其中 returns ArrayList 包含远程计算机上的所有用户配置文件。
在其他功能中,我需要 运行 Invoke-Command 并循环遍历 $ListOfUserProfiles 给定的所有用户配置文件,并删除每个配置文件的 Chrome 缓存。
但是我 运行 遇到了一个问题,$ListOfUserProfiles 在我的 Invoke-Command 中 empty/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"\AppData\Local\Google\Chrome\User Data" -Filter "*.tmp" | foreach {
Remove-Item -Path $_.FullName
WriteLog "INFO: Deleting $($_.FullName)"
}
}
}
Delete-Chrome-Temp-Files
我的机器上有 6 个配置文件,你可以看到我在这里使用了 3 次计数方法,它们 return:
6
6
0(我预计这里有 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
}
我有一段代码可以删除远程机器上所有用户配置文件的 Google Chrome 缓存。
为了实现这一点,我使用了函数 GetMachineUserProfiles,其中 returns ArrayList 包含远程计算机上的所有用户配置文件。 在其他功能中,我需要 运行 Invoke-Command 并循环遍历 $ListOfUserProfiles 给定的所有用户配置文件,并删除每个配置文件的 Chrome 缓存。
但是我 运行 遇到了一个问题,$ListOfUserProfiles 在我的 Invoke-Command 中 empty/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"\AppData\Local\Google\Chrome\User Data" -Filter "*.tmp" | foreach {
Remove-Item -Path $_.FullName
WriteLog "INFO: Deleting $($_.FullName)"
}
}
}
Delete-Chrome-Temp-Files
我的机器上有 6 个配置文件,你可以看到我在这里使用了 3 次计数方法,它们 return:
6
6
0(我预计这里有 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
}