谁能向我解释为什么我可以写“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
谁能向我解释为什么我可以写“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
我将添加到 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
我猜您正在尝试将“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 命令。
可能是因为powershell的管道功能和cmd提示符不一样
如果你使用cmd /c echo Y| cacls ....
它会工作。