2017-08-16 95 views
0

使用用户登录名和计算机名的特定输入我想删除远程计算机上该用户的临时Internet文件。我几乎可以使它工作,但是当我尝试将文件路径作为变量传递时,它将失败,并且为空,或者不包含用户名。我已经Google搜索并试图自己修复几个小时。 我已经玩了一段时间的PowerShell,但我的'脚本'是我定义变量和管道命令。除此之外的任何事情都可能会让我感到困惑,尽管如此,任何帮助都不胜感激。以下是我到目前为止。冗余只是检查我的变量是否被传递,直到-Scriptblock,这是出错的地方。调用命令清除Internet Explorer缓存

$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

为什么需要在远程计算机上删除该目录的内容? –

+0

用户已经为OWA缓存了凭据,并且已经更改了密码。旧凭证不断尝试认证并锁定用户。 –

+0

清除缓存修复程序? (奇数) –

回答

1

这会被问到很多。您正在调用一个新的会话或运行时环境,其中$ UNC的内容不存在。您需要将该值从调用脚本传递给被调用的调用。你可以用-ArgumentList来完成。该参数的Invoke-CommandInvoke-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) 
} 
+0

我知道该变量不再存在,但我无法完全弄清楚如何使这个工作适合我的情况。有没有一本我可以阅读的书来使这有意义? –

+0

这里是该方法的文档:https://msdn.microsoft.com/en-us/library/bb355170(v=vs.110).aspx 我还将更新答案与工作代码供您测试用。 –