Regex 为什么FINDSTR在powershell和cmd中的行为不同?

Regex 为什么FINDSTR在powershell和cmd中的行为不同?,regex,powershell,windows-7,cmd,findstr,Regex,Powershell,Windows 7,Cmd,Findstr,下面的命令将echo的输出传输到findstr,并尝试将正则表达式与之匹配。我使用它来检查回声线是否仅由(一个或多个)数字组成: findstr的预期输出是123,这意味着表达式可以与此字符串匹配。使用powershell.exe执行命令时,输出是正确的。 但是,在cmd.exe中执行命令不会给出匹配项。它只输出一个空行,并将%ERRORLEVEL%设置为1,这意味着找不到匹配项。 是什么导致了不同的行为?有没有办法让这个命令也在cmd上正确运行 我的操作系统是Windows 7 Profess

下面的命令将
echo
的输出传输到
findstr
,并尝试将正则表达式与之匹配。我使用它来检查回声线是否仅由(一个或多个)数字组成:

findstr
的预期输出是
123
,这意味着表达式可以与此字符串匹配。使用
powershell.exe
执行命令时,输出是正确的。 但是,在
cmd.exe
中执行命令不会给出匹配项。它只输出一个空行,并将
%ERRORLEVEL%
设置为1,这意味着找不到匹配项。
是什么导致了不同的行为?有没有办法让这个命令也在cmd上正确运行


我的操作系统是Windows 7 Professional,64位。

在Powershell中,该命令将字符串
123
回显到管道中,并与正则表达式匹配

在cmd中,您的命令将
123
回送到管道。正则表达式中不允许使用尾随空格,因此无法获得匹配项

尝试:

它会很好的工作。或者干脆完全切换到Powershell,不再担心
cmd.exe
的变幻莫测

编辑: 是的,cmd和powershell处理参数的方式非常不同

使用cmd时,所有程序都会被传递一个简单的文本命令行。cmd执行的处理非常简单:它将在
|
&
处终止命令,删除i/o重定向并替换任何变量。当然,它还会识别命令并执行它。任何参数处理都是由命令本身完成的,因此命令可以选择是空格分隔参数还是字符的含义。
大多数命令对这些内容有一个相当常见的解释,但它们可以使用给定的字符串做自己的事情。
echo
做自己的事情

另一方面,Powershell具有复杂的参数语法。所有参数解析都由Powershell完成。然后,解析的参数将作为.Net对象序列传递给Powershell函数或cmdlet:这意味着您不仅限于传递简单字符串。如果该命令不是Powershell命令,则d在外部运行它将尝试将对象转换为字符串,并在任何有空格的参数周围加引号。有时转换可能会有点混乱,但它确实意味着类似以下情况:

echo (1+1)
将在Powershell中回显
2
,其中cmd只回显输入字符串

值得始终记住的是,使用Powershell时,您正在处理对象,例如:

PS C:\> echo Today is (get-date)
Today
is

17 April 2014 20:03:15


PS C:\> echo "Today is $(get-date)"
Today is 04/17/2014 20:03:20

在第一种情况下,
echo
获取3个对象、两个字符串和一个日期。它将每个对象输出到单独的一行(类型更改时为一个空行)。在第二种情况下,它获取一个字符串对象(与cmd
echo
不同,它从未看到引号).

谢谢,这确实有效。但为什么echo的行为会有所不同?cmd处理参数的方式是否与powershell不同?@maddin45添加了一些关于如何处理参数的描述。哇,我想powershell确实名副其实。谢谢你的透彻解释!如果可以的话,我会再次投票支持这个答案:)我想我我将进一步研究PowerShell的功能,这似乎非常有用。
echo (1+1)
PS C:\> echo Today is (get-date)
Today
is

17 April 2014 20:03:15


PS C:\> echo "Today is $(get-date)"
Today is 04/17/2014 20:03:20