首页 > 解决方案 > 在 shell 脚本中执行的批处理文件不等待用户输入

问题描述

我偶然发现了 git-hooks 并试图创建一个在 Windows 上运行。所以我决定使用批处理文件来这样做,因为它看起来很容易。

首先,我将 pre-commit 示例重命名为 pre-commit 并在那里调用了我的 bat 步骤:

#!/bin/sh
$(pwd)/git-hooks/hooks/unit_test.bat &&
$(pwd)/git-hooks/hooks/integration_test.bat

unit_test.bat显示一些消息并运行单元测试任务,但integration_test.bat提示用户是否要运行这些测试,因为它们通常较慢。

问题是提示(使用“选择”或“设置/p ”完成)没有得到用户输入

我尝试添加start来调用 .bat 文件,但它会在另一个 cmd 上打开它们,因此无法停止提交。

引用的文件

标签: windowsshellbatch-filegithooks

解决方案


我认为这gradlew实际上是另一个批处理文件,gradlew.bat所以我假设,如果您希望它在完成后返回到脚本,您应该使用该Call命令。另外,您应该知道将&两个单独的命令连接在一行上,而&&仅在前一个命令成功时才运行一个命令。在您的情况下,Echo命令不可能不成功,所以只是&必要的。此外,If ErrorLevel 1如果错误代码是1或更高,这意味着,在您发布的代码中,代码将始终goto sim. 您应该改用If Not ErrorLevel 2,If %ErrorLevel% Equ 1If "%ErrorLevel%" == "1".

示例:(请插入完整路径,gradlew.bat而不是依赖容易损坏或受影响%Path%的变量,如果路径和可执行文件名称包含空格或有问题的字符,请用双引号引起来)。我在下面的示例中删除了不必要的连接,因为它在脚本中不是必需的。

unit_test.bat

@Echo Off
Echo ^> Testes unitários
Call gradlew.bat testReport || (Echo(& Echo Testes unitários falharam! Acesse o relatório de testes para conferir.& Exit 1)

集成测试.bat

@Echo Off
Echo(
Echo ^> Testes integrados
%SystemRoot%\System32\choice.exe /C sn /M "Esses testes geralmente são mais lentos. Quer rodar os testes integrados"
If Not ErrorLevel 2 GoTo sim
Echo(
Echo Não se esqueça de confirmar que os testes integrados passam antes de fazer o 'git push'!
Exit /B

:sim
Call gradlew.bat integrationTests || (
    Echo(
    Echo Testes integrados falharam! Acesse o relatório de testes para conferir.
)
Exit 1

或者:

@Echo Off
Echo(
Echo ^> Testes integrados
%SystemRoot%\System32\choice.exe /C sn /M "Esses testes geralmente são mais lentos. Quer rodar os testes integrados"
If ErrorLevel 2 GoTo nao
Call gradlew.bat integrationTests || (
    Echo(
    Echo Testes integrados falharam! Acesse o relatório de testes para conferir.
)
Exit 1

:nao
Echo(
Echo Não se esqueça de confirmar que os testes integrados passam antes de fazer o 'git push'!
Exit /B

根据您使用的某些字符,我还建议您确保使用适当的代码页(可能是 1252)运行脚本。


推荐阅读