任何人都可以向我解释为什么我可以写'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
答案 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;
它会起作用。