我想知道如何从PowerShell中逃避以下命令以便它能够正常工作?
PS C:\Users\buster\Documents\> find -name \*.c
PowerShell说:找不到错误* .c
PS C:\Users\buster\Documents\> find -name *.c
PowerShell说:找不到错误* .c
答案 0 :(得分:1)
如果您使用find
(没有完整路径),则最有可能使用Windows附带的find.exe
(C:\Windows\system32\find.exe
),这更类似于{{1}而不是Unix grep
。您得到该行为是因为Windows在find
中搜索具有给定名称的文件中的所有目录(如果未指定扩展名,则在$env:PATH
中列出一个扩展名),并执行第一个匹配。由于$env:PATHEXT
通常位于PATH的开头,因此可执行文件优先。
您可以将%windir%\system32
添加到PATH的开头(C:\msys64\msys64\usr\bin
之前),但我不建议这样做。更好的方法是为命令定义alias:
%windir%\system32
别名优先于文件。您可以将别名定义放在PowerShell profile中,以便在启动PowerShell时自动加载它。
或者你可以简单地使用New-Alias -Name 'find' -Value 'C:\msys64\msys64\usr\bin\find.exe'
(ls -r -fi '*.c'
的缩写),这将是PowerShell方式。
答案 1 :(得分:0)
好误报..
显然,这是一个Windows的例子,其中一个可执行文件与msys2的c:\ windows \ system32下的find.exe同名,而windows命令在路径列表中获得更高的优先级。在明确键入到findys的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