在 Powershell 中,该命令将字符串 123 回显到管道并且与您的正则表达式匹配。
在 cmd 中,您的命令将 123<space> 回显到管道。正则表达式中不允许使用尾随空格,因此无法匹配。
试试:
echo 123| findstr /r /c:"^[0-9][0-9]*$"
它会工作得很好。或者完全切换到 Powershell,而不必担心 cmd.exe 的变幻莫测。
编辑:
是的,cmd 和 powershell 处理参数的方式非常不同。
使用 cmd,所有程序都通过一个简单的文本命令行传递。 cmd 执行的处理非常少:它将在| 或& 终止命令,删除 i/o 重定向并替换任何变量。当然,它也识别命令并执行它。任何参数处理都是由命令本身完成的,因此命令可以选择是空格分隔参数还是" 字符的含义。大多数命令对这些事情有一个相当普遍的解释,但他们可以用他们给出的字符串做他们自己的事情。 echo 做自己的事。
另一方面,Powershell 具有复杂的参数语法。所有的参数解析都是由 Powershell 完成的。然后将解析的参数作为 .Net 对象序列传递给 Powershell 函数或 cmdlet:这意味着您不仅限于传递简单的字符串。如果该命令结果不是 powershell 命令并在外部运行,它将尝试将对象转换为字符串并在任何有空格的参数周围加上引号。有时转换可能会有点混乱,但这确实意味着这样的事情:
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 不同,它永远不会看到引号)。