从 WSL 运行 .bat 文件时出现“call: 未找到命令”消息

从 WSL 运行 .bat 文件时出现“call: 未找到命令”消息

我最近接手了一个项目,其中有一些简单的 .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

相关内容