![从 WSL 运行 .bat 文件时出现“call: 未找到命令”消息](https://linux22.com/image/1631497/%E4%BB%8E%20WSL%20%E8%BF%90%E8%A1%8C%20.bat%20%E6%96%87%E4%BB%B6%E6%97%B6%E5%87%BA%E7%8E%B0%E2%80%9Ccall%3A%20%E6%9C%AA%E6%89%BE%E5%88%B0%E5%91%BD%E4%BB%A4%E2%80%9D%E6%B6%88%E6%81%AF.png)
我最近接手了一个项目,其中有一些简单的 .bat 文件用于构建它。但是,我想在 WSL 中运行这些文件。特别是,它有两个以嵌套方式使用的构建文件。
构建.bat:
call generated_java.bat
mvn clean compiler assembly:single
生成java.bat:
SET path_to_grammar=%~dp0\resources
SET path_to_package=%~dp0\src\main\java\xyzzy
SET path_to_antlr=%~dp0\bin\antlr-4.8-complete.jar
echo %path_to_grammar%
echo %path_to_package%
echo %path_to_antlr%
@java -Xmx500M -jar %path_to_antlr% -o %path_to_package% -Dlanguage=Java -package xyzzy -encoding UTF-8 -listener -visitor %path_to_grammar%\Lexer.g4 %path_to_grammar%\Parser.g4
我通过输入以下命令从 WSL 运行它:
command ./build.bat | cat
但是,它给出了如下错误消息:
@echo: command not found
SET: command not found
...
@java: command not found
这似乎将调用的 generate_files.bat 视为 bash shell 脚本,而不是应该用命令运行的 .bat 文件。
有没有关于如何修复此问题的建议,并且仍然从 WSL 内部执行此操作,而不是运行 DOS 框(或现在他们称之为命令终端的任何内容)。我之所以关心这个问题,是因为我想在我的 Emacs 中运行它,我在 WSL 下启动它并将其用于我的所有 shell,因为它会将所有输出捕获到可滚动和可编辑的缓冲区中。
答案1
关键是输入:
cmd.exe /c built.bat
cmd 和 command 被视为 Linux 命令。您需要 .exe 后缀才能获得“Windows 命令提示符”。
答案2
如果要从 wsl 启动 cmd.exe 来运行批处理,则必须正确调用它并为其提供批处理的正确路径。如果批处理位于 Windows 文件系统上的文件夹中,则最简单
这就是我使用 32 位 cmd.exe 从 wsl2 运行批处理脚本的方法
/mnt/c/Windows/SysWOW64/cmd.exe /c c:\batch\wslxvnc.bat
如果你需要 64 位 cmd.exe 使用/mnt/c/Windows/System32/cmd.exe
答案3
command
是 shell 的内建命令。来自 ( man bash
):
command [-pVv] command [arg ...]
Run command with args suppressing the normal shell function
lookup. Only builtin commands or commands found in the PATH are
executed. If the -p option is given, the search for command is
performed using a default value for PATH that is guaranteed to
find all of the standard utilities. If either the -V or -v
option is supplied, a description of command is printed. The -v
option causes a single word indicating the command or file name
used to invoke command to be displayed; the -V option produces a
more verbose description. If the -V or -v option is supplied,
the exit status is 0 if command was found, and 1 if not. If
neither option is supplied and an error occurred or command
cannot be found, the exit status is 127. Otherwise, the exit
status of the command builtin is the exit status of command.
因此,如果你使用它,它将会失败。我可以轻松地使用以下命令运行它们:
cmd.exe /c build.bat