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个对象、两个字符串和一个日期。它将每个对象输出到单独的一行(类型更改时为一个空行)。在第二种情况下,它获取一个字符串对象(与cmdecho
不同,它从未看到引号).谢谢,这确实有效。但为什么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