我有一段代码,删除远程机器上所有用户配置文件的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
}