-1

谁能向我解释为什么我可以写“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
4

3 回答 3

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
于 2013-12-05T18:14:14.673 回答
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 命令。

于 2013-12-05T18:03:26.613 回答
0

可能是因为powershell的管道功能和cmd提示符不一样

如果你使用cmd /c echo Y| cacls .... 它会工作。

于 2016-02-12T14:09:55.977 回答