我做了一个愚蠢的决定,把我的工作环境搬到Windows 11。
我已经下载了使用 chocolatey 的 GNU Make 版本 4.3'cat' is not recognized as an internal or external command, operable program or batch file.
。当我提示它输入版本时,它会做出回复,但当我要求它构建我的项目时,它会返回错误。
我正在Windows Powershell 版本 5.1.22000.1335,我可以在其中运行“$cat ExampleFile.txt”并查看预期行为。我甚至可以找到别名表,显示 Powershell 将 cat 转换为 Get-Content,但由于某种原因,此别名未应用于 make 系统内的调用。我是否应该将 Powershell 别名 cat 应用于其他命令?
有人解决过此类问题吗?谢谢阅读!
答案1
“您的项目”在其构建过程中使用的事实cat
表明它很可能是一个针对(至少最初)Linux(或其他类 UNIX 操作系统)的项目。
在这种情况下(或者甚至在任何情况下都不是 VS 项目?),你可能需要一个完整的工具链等。等(嗯,例如cat
)无论如何,系统管理软件可能是您想要考虑的选择之一。它提供了不同的 shell,这些 shell 设置为允许构建程序的本机 Windows (mingw) 版本或 msys2 版本(依赖于 msys2 提供的 POSIX 兼容层/库)。
注意,是否可以像前者一样构建程序取决于程序本身的可移植性。
w64devkit和温利布斯是您可能感兴趣的替代方案。(但不确定您是否会得到cat
后者。)
GNU Make 实际上只是一个处理 Makefile 的程序。它是否足以满足您的“项目”需求取决于 Makefile 指示的具体运行内容(直接或间接)。
cat
是 GNU coreutils 的一部分。(嗯,我想有不同的实现cat
;例如,您也可以cat
从 busybox 获得。)我不确定是否还能为 Windows 构建它的本机版本。不过,显然有一个古老的端口,您也可以通过 chocolatey 获得。(另一个选择可能是这。
答案2
至于这个,
"$cat ExampleFile.txt"
以这种方式指定的 $cat 或 "$cat" 是一个变量。
"$cat D:\temp\TestFile.txt"
# Results
<#
"$cat D:\temp\TestFile.txt"
The variable '$cat' cannot be retrieved because it has not been set.
At line:1 char:2
+ "$cat D:\temp\TestFile.txt"
+ ~~~~
+ CategoryInfo : InvalidOperation: (cat:String) [], RuntimeException
+ FullyQualifiedErrorId : VariableIsUndefined
#>
PS 将评估变量中的值/数据$cat
,而不是运行cat
命令。
查看有关 PowerShell 变量扩展的可用信息。
https://devblogs.microsoft.com/powershell/variable-expansion-in-strings-and-here-strings/
如上所述,cat
是 的别名Get-Content
,必须以此方式使用。
为了使命令起作用,您必须这样做。
cat 'D:\temp\TestFile.txt'
# Results
<#
1 21/05/20
2 21/05/20
3 21/05/20
4 21/05/20
5 21/05/20
6 21/05/20
7 21/05/20
8 21/05/20
#>
除非你这样做……
$cat = cat
... 代码中的其他地方。这意味着您将命令分配给了变量名。这对于单个注释来说并不十分谨慎。
如果您在此用例中尝试这样做,它仍然会失败。
$cat = cat
"$cat D:\temp\TestFile.txt"
# Results
<#
$cat = cat
"$cat D:\temp\TestFile.txt"
cmdlet Get-Content at command pipeline position 1
Supply values for the following parameters:
Path[0]:
#>
要使上述变量发挥作用,您必须将其声明为函数或 ScriptBlock。恕我直言,如果您这样做,只会让事情变得过于复杂。
# using a ScriptBlock
$cat = {cat $($args[0])}
& $cat 'D:\temp\TestFile.txt'
# Results
<#
1 21/05/20
2 21/05/20
3 21/05/20
4 21/05/20
5 21/05/20
6 21/05/20
7 21/05/20
8 21/05/20
#>
关于脚本块
最后,要发现任何外部命令,它必须位于您的系统和 PS 路径中。
另请参阅 PS 命令优先级
PowerShell-运行可执行文件- TechNet 文章 - 美国(英语) - TechNet Wiki
https://social.technet.microsoft.com/wiki/contents/articles/7703.powershell-running-executables.aspx