批处理脚本 - 带括号的“Where”这个词的回声问题

Vom*_*yle 7 batch-file

不久前,我询问了Batch Script Redirection Syntax,并得到了很好的回答。我在批处理脚本中()更频繁地使用括号方法echo并重定向到文件等。

我遇到了一个奇怪的问题,它似乎Where无法将echo单词从字面上理解为该单词,而且它似乎Where被解释为正在调用的命令。


为了让这个例子简单,我将脚本逻辑简化为一个更简单的版本,但PowerShell逻辑echo可能比这复杂得多。

脚本示例

@ECHO ON

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

PAUSE
Run Code Online (Sandbox Code Playgroud)

错误

INFO: Could not find files for the given pattern(s).
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


我所做的

我对此进行了一些故障排除并进行了一些快速研究,但找不到简单的答案。由于我没有问过很多关于SuperUser 的问题,我认为这可能是一个很好的问题。

我特别尝试的一件事是将变量设置为Where(ie SET w=Where)的字符串值,然后在括号中的echo命令中我引用了该变量 (ie %w%) 来代替单词,Where但结果仍然是相同的错误。

我也玩了一点,SETLOCAL ENABLEDELAYEDEXPANSION但没什么区别。

@ECHO ON
SET w=Where
(
    ECHO [System.IO.DriveInfo]::GetDrives() ^| %w% {$_.Name -like "C:\"}
)>> Outfile.txt
PAUSE
Run Code Online (Sandbox Code Playgroud)

解决方法

我只是没有使用带括号的方法来echo输入单词“ Where”,我只是在涉及“ ”的>>每个echo'd 行上单独使用附加的重定向到文件方法where。对于这个小例子来说没什么大不了的,但是对于更大的脚本来说却是一件大事。

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

相关问题

嗯嗯……

  1. 是什么导致了这种情况以及发生这种情况时究竟发生了什么?

  2. 有没有办法允许在Where没有问题的情况下使用单词(或字符串)“ ”?


资源

dbe*_*ham 4

你误判了这个问题——WHERE 与它无关。

您只需转义右括号即可:

@ECHO ON

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

PAUSE
Run Code Online (Sandbox Code Playgroud)

  • 实际上,“where”并非完全无关:正是“where.exe”生成了错误消息“信息:找不到...”。换句话说,由于提问者的语法,“where”被视为命令,而不是子句。 (3认同)
  • @AFH - 我已经在 http://www.dostips.com/forum/viewtopic.php?f=3&t=8198 开始讨论这个奇怪的现象 (3认同)