使用用户登录名和计算机名的特定输入我想删除远程计算机上该用户的临时Internet文件。我几乎可以让它工作,但是当我尝试将文件路径作为变量传递时,它会因为空或者不包含用户名而失败。我用谷歌搜索并试图自己解决它几个小时了。 我曾经玩过powershell一段时间,但我的脚本编写了#39;是我定义变量和管道命令。除此之外的任何事情可能会让我感到困惑,但任何帮助都会受到赞赏。以下是我到目前为止的情况。冗余只是我检查我的变量是否被传递,直到-Scriptblock,这是出错的地方。
$User = Read-Host -Prompt 'Please input the user logon name.'
$CompName = Read-Host -Prompt 'Please enter the target computername.'
$UNC = "C:\Users\$User\AppData\Local\Microsoft\Windows\Temporary Internet Files"
$Block = { Remove-Item $UNC -Recurse -Force -EA Continue }
Invoke-Command -ComputerName $CompName -ScriptBlock {$Block}
答案 0 :(得分:1)
这被问了很多。您正在调用$ UNC的内容不存在的新会话或运行时环境。您需要将该值从调用脚本传递到被调用的调用。您使用-ArgumentList
执行此操作。 Invoke-Command
和Invoke-Expression
的语法对于此参数是相同的。这是一个完整的例子:
Cannot bind parameter to argument 'command' beacuse it is null. Powershell
另外,我会改变这个:
Invoke-Command -ComputerName $CompName -ScriptBlock {$Block}
对此:
Invoke-Command -ComputerName $CompName -ScriptBlock $Block
意思非常不同。 {$Block}
将运行一个输出$ Block值(空白)的脚本。而没有{}
你传递一个要解析的scriptblock变量。
这是一个有效的例子:
$OutsideVar = "Hello World!"
invoke-command -ArgumentList $OutsideVar -ScriptBlock {
param( $InsideVar )
Write-Host $InsideVar
}
理解这里发生的事情的关键是理解范围。 $ OutsideVar存在于顶级进程范围内。当您使用Invoke-Command
$ OutsideVar启动新范围时,不再存在。就像您可以使用参数调用.EXE文件一样,您可以使用参数调用此新范围。你必须告诉内部范围如何处理这些参数,这就是param()
块正在做的事情。它说:"你将获得1个参数,将其存储在$ InsideVar"中。现在,您在内部范围内拥有该值。您可以通过添加更多参数来传递多个值:
invoke-command -ArgumentList $OutsideVar, $OutsideVar2, $OutsideVar3 -ScriptBlock {
param( $InsideVar, $InsideVar2, $InsideVar3 )
}