不久前我问过批处理脚本重定向语法并得到了一个很好的答案。我()
更经常使用括号方法来echo
处理批处理脚本并重定向到文件等。
我遇到了一个奇怪的问题,似乎这个词Where
不能echo
按字面意思理解,而且似乎被解释为Where
而是调用命令。
为了使这个例子简单,我把脚本逻辑简化成一个更简单的版本,但是电源外壳逻辑echo
可能比这复杂得多。
脚本示例
@ECHO ON
(
ECHO [System.IO.DriveInfo]::GetDrives() ^| Where {$_.Name -like "C:\"}
)>> Outfile.txt
PAUSE
错误
INFO: Could not find files for the given pattern(s).
我做了什么
我对此进行了一些故障排除,并做了一些快速研究,但找不到一个简单的答案。由于我没有问过很多关于超级用户,我认为这可能是一个好主意。
我特别尝试的一件事是将变量设置为字符串值Where
(即SET w=Where
),然后在括号内的echo
命令中我引用该变量(即%w%
)代替单词,Where
但结果仍然是相同的错误。
我也尝试了一下SETLOCAL ENABLEDELAYEDEXPANSION
但没有什么区别。
@ECHO ON
SET w=Where
(
ECHO [System.IO.DriveInfo]::GetDrives() ^| %w% {$_.Name -like "C:\"}
)>> Outfile.txt
PAUSE
解决方法
我只是没有使用括号方法来echo
处理单词“ Where
”,而只是在涉及“ ”的每一行>>
上分别使用附加的重定向到文件方法。对于这个小例子来说没什么大不了的,但对于更大的脚本来说就大了。echo
where
@ECHO ON
ECHO [System.IO.DriveInfo]::GetDrives() ^| Where {$_.Name -like "C:\"}>> Outfile.txt
PAUSE
相关问题
嗯嗯......
是什么原因造成的?当这种情况发生时,究竟发生了什么?
有没有办法允许使用单词(或字符串)“
Where
”而不会出现问题?
资源
答案1
您误诊了问题——这与 WHERE 无关。
您只需要转义右括号:
@ECHO ON
(
ECHO [System.IO.DriveInfo]::GetDrives(^) ^| Where {$_.Name -like "C:\"}
)>> Outfile.txt
PAUSE
答案2
这里还有另一个选项。这不需要您转义括号或管道。当您将 NUL 设备重定向到命令时,SET /P
它会将提示字符串写入 stdout。对此的一个警告是,它SET /P
不会写出回车符和换行符,因此您需要一个空字符ECHO.
来输出 CRLF。
@ECHO OFF
(
<nul set /p "=[System.IO.DriveInfo]::GetDrives() | Where {$_.Name -like "C:\"}" &echo.
echo another line
)>Outfile.txt
notepad Outfile.txt
PAUSE
答案3
不管怎样,似乎在之后)
,CMD 解释^|
为|
:
C:\> (echo 1.The && echo 2.quick && echo 3.brown && echo 4.fox) ^| find "q"
2.quick