为什么不回应是|在我的脚本中工作?

时间:2013-12-05 14:31:40

标签: powershell cacls

任何人都可以向我解释为什么我可以写'ECHO Y |'在Powershell命令行中,但如果我在脚本中实现它,则不行?

这些变量取自.csv文件。当我使用命令行时,我没有使用变量。

ECHO Y|cacls $_."Serverdisc" /G ADMINISTRATORS:F
 cacls $_."Serverdisc" /G $_."Username":C /T /E
 cacls $_."Serverdisc" /G SYSTEM:F /T /E

3 个答案:

答案 0 :(得分:3)

我猜你试图将“Y(es)”传递给任何可能的提示? CMD shell和PowerShell是两种不同的shell。您要做的是使用Powershell的CMD shell语法,因此遇到了麻烦

当您迭代来自管道的数组时,会使用

$ _,因此除了您在此处共享的内容之外,还必须有其他内容。我会举个例子。

假设我在c:\ temp \:

中有2个文件
c:\temp\a.txt
c:\temp\b.txt

我希望授予他们权限,而不是提示。

"c:\temp\a.txt","c:\temp\b.txt" | foreach-object {
ECHO Y|cacls $_ /G ADMINISTRATORS:F
echo Y|cacls $_ /G SYSTEM:F /T /E
}

这相当于以下

ECHO Y|cacls c:\temp\a.txt /G ADMINISTRATORS:F
echo Y|cacls c:\temp\a.txt /G SYSTEM:F /T /E
ECHO Y|cacls c:\temp\b.txt /G ADMINISTRATORS:F
echo Y|cacls c:\temp\b.txt /G SYSTEM:F /T /E

$ _正在被来自管道的东西替换为foreach-object,这几乎模仿了可以工作的CMD shell命令。

答案 1 :(得分:3)

我将添加Adil H.的评论并说使用cacls是折旧的。您应该使用 icacls 。 icacls有一个参数/ Q(安静),它将禁止所有确认消息,您不必在代码中使用ECHO Y|

(假设你的脚本的其余部分按顺序排列(参见Adil H.的帖子))你的脚本块将改为:

icacls $_."Serverdisc" /Q /Grant ADMINISTRATORS:F
icacls $_."Serverdisc" /Q /Grant $_."Username":C /T
icacls $_."Serverdisc" /Q /Grant SYSTEM:F /T

答案 2 :(得分:0)

这可能是因为powershell的管道功能与cmd提示不同

如果您使用try ConnectAs('Administrator','password'); except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; // Restart the Windows service // Done, back to the user RevertToSelf; 它会起作用。