gpt4 book ai didi

regex - 为什么FINDSTR在powershell和cmd中表现不同?

转载 作者:行者123 更新时间:2023-12-03 01:18:22 24 4
gpt4 key购买 nike

以下命令将echo的输出传递到findstr,并尝试将其与正则表达式匹配。我用它来检查回显的行是否仅包含(一个或多个)数字:

echo 123 | findstr /r /c:"^[0-9][0-9]*$"
findstr的预期输出是 123,这意味着表达式可以与此字符串匹配。当我使用 powershell.exe执行命令时,输出正确。
但是,在 cmd.exe中执行命令不会给出匹配。它仅输出一个空行并将 %ERRORLEVEL%设置为1,这意味着未找到匹配项。
是什么导致了不同的行为?有没有办法使此命令也可以在cmd上正确运行?

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

最佳答案

在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不同,它永远不会看到引号)。

关于regex - 为什么FINDSTR在powershell和cmd中表现不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23136167/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com