如何使用正确的shell转义字符从PowerShell调用msys2 find命令?

如何使用正确的shell转义字符从PowerShell调用msys2 find命令?,powershell,msys2,Powershell,Msys2,我想知道如何从PowerShell中退出以下命令,使其正常工作 PS C:\Users\buster\Documents\> find -name \*.c PowerShell显示:找不到错误*.c PS C:\Users\buster\Documents\> find -name *.c PowerShell显示:找不到错误*.c正常假警报 PS C:\Users\buster\Documents\> find -name *.c 很明显,windows的可执行

我想知道如何从PowerShell中退出以下命令,使其正常工作

PS C:\Users\buster\Documents\> find -name \*.c 
PowerShell显示:找不到错误*.c

PS C:\Users\buster\Documents\> find -name *.c 
PowerShell显示:找不到错误*.c

正常假警报

PS C:\Users\buster\Documents\> find -name *.c 
很明显,windows的可执行文件与c:\windows\system32下msys2的find.exe同名,windows命令在路径列表中的优先级更高。在显式键入find.exe的msys64版本的完整路径后,它可以工作

PS C:\Users\buster\Documents\> C:\msys64\msys64\usr\bin\find -name \*.c
此外,还有一种更好的方法可以找到cmd.exe本机的*.c文件,您可以像这样从powershell调用这些文件:

PS C:\Users\buster\Documents\> cmd /c dir /S /B *.v
如果这样使用find而没有完整路径,则最有可能使用Windows C:\Windows\system32\find.exe附带的,它更类似于grep而不是Unix find。之所以会出现这种行为,是因为如果未指定扩展名,Windows会在$env:PATH中的所有目录中搜索具有给定名称和$env:PATHEXT中列出的扩展名之一的文件,并执行第一个匹配。由于%windir%\system32通常位于路径的开头,因此路径中的可执行文件优先

您可以将C:\msys64\msys64\usr\bin添加到%windir%\system32之前的路径开头,但我不建议这样做。更好的方法是为命令定义一个:

New-Alias -Name 'find' -Value 'C:\msys64\msys64\usr\bin\find.exe'
别名优先于文件。您可以将别名定义放在PowerShell中,以便在启动PowerShell时自动加载别名定义

或者您可以简单地使用ls-r-fi'*.c'作为Get-ChildItem-Recurse-Filter'*.c'的缩写,这将是PowerShell方式