批处理脚本 - 带括号的单词“Where”回显问题

批处理脚本 - 带括号的单词“Where”回显问题

不久前我问过批处理脚本重定向语法并得到了一个很好的答案。我()更经常使用括号方法来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”,而只是在涉及“ ”的每一行>>上分别使用附加的重定向到文件方法。对于这个小例子来说没什么大不了的,但对于更大的脚本来说就大了。echowhere

@ECHO ON
ECHO [System.IO.DriveInfo]::GetDrives() ^| Where {$_.Name -like "C:\"}>> Outfile.txt
PAUSE

相关问题

嗯嗯......

  1. 是什么原因造成的?当这种情况发生时,究竟发生了什么?

  2. 有没有办法允许使用单词(或字符串)“ 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

相关内容