windows - 在 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 ”完成)没有得到用户输入:
- ' set /p ' 不等待用户输入
- “选择”冻结并且不允许任何用户输入
我尝试添加start来调用 .bat 文件,但它会在另一个 cmd 上打开它们,因此无法停止提交。
引用的文件
unit_test.bat
@echo off echo ^> Testes unitários call gradlew 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 ERRORLEVEL 2 goto nao call gradlew 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
解决方案
我认为这gradlew
实际上是另一个批处理文件,gradlew.bat
所以我假设,如果您希望它在完成后返回到脚本,您应该使用该Call
命令。另外,您应该知道将&
两个单独的命令连接在一行上,而&&
仅在前一个命令成功时才运行一个命令。在您的情况下,Echo
命令不可能不成功,所以只是&
必要的。此外,If ErrorLevel 1
如果错误代码是1
或更高,这意味着,在您发布的代码中,代码将始终goto sim
. 您应该改用If Not ErrorLevel 2
,If %ErrorLevel% Equ 1
或If "%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)运行脚本。
推荐阅读
- angular - 如何在输入焦点上动态控制Angular 2+中的父元素类?
- php - 你能给我澄清一下吗
- javascript - 如何使我的轮播居中?
- html - 如何使 div 具有父级的 100% 高度,而与子级的大小无关?复杂的布局
- javascript - sharepoint 中的多个唯一列
- angular - Angular 2 Release 6 如何添加 esri ArcGIS API for JavaScript 3.24
- python - Django连接光标不显示任何表?
- node.js - 获取去重的 npm 树
- sql - oracle sql语句解析字符串
- c# - 如何在 Visual Studio 中启动 ac# 空项目。