我想创建一个简单的程序来检查命令的输出是否包含错误,请停止下一个命令。
这是我尝试的
@ECHO OFF
SET list=fatal
SET list=%list%;error
SET list=%list%;conflict
SET list=%list%;failed
git pull origin master > temp.txt
for %%cWord in (%list%) do (
SET /P vPull=<temp.txt
IF NOT x%vPull:%%cWord=%==x%vPull%
ECHO please fix the error then try to pull again!
)
PAUSE > nul
上面的代码执行git pull origin master
,然后检查命令的输出是否包含list
字符串,如果是,程序将停止执行下一条命令。
我尝试上面的代码,但打开后程序退出。
答案 0 :(得分:1)
似乎您想要这样的东西:
@echo off
for /f "tokens=1,2*delims=:" %%i in ('git pull origin master 2^>^&1') do (
set rtncode=%%i:%%j
if /i "%%i"=="fatal" echo %%i:%%j & goto :end
if /i "%%i"=="error" echo %%i:%%j & goto :end
if /i "%%i"=="conflict" echo %%i:%%j & goto :end
if /i "%%i"=="failed" echo %%i:%%j & goto :end
)
echo %rtncode%
echo When you get here, you did not experience the errors above, so code can go here
:end
Pause
解释代码。 for /f
使用定界符:
将字符串分为两部分,然后将:
之前的所有内容分配给第一个元变量%%i
,并将:
之后的所有内容分配给到%%j
,因为我们专门说过要使用令牌1
和2
。
这里的重要部分是命令后的2>^&1
位。这指定我们应该将标准错误重定向到标准输出。这允许将错误消息以及正常的成功消息分配给元变量。然后,我们只将每个分配的元变量%%i
与硬编码的文本fatal
,error
等进行匹配,这样匹配最终会变成这样。元变量%%i
已分配了值,假设fatal
:
if /i "fatal"=="fatal"
以上匹配,因此它将执行条件
echo %%i:%%j & goto :end
这将打印存储的错误消息并退出循环并绕过:end
您可以打开cmd.exe
并运行以下命令以获得更多帮助:
for /?
if /?
我添加了set
设置%rtncode%
,它将为输出分配任何输出,如果您不匹配循环中的任何错误,则会显示该输出。
答案 1 :(得分:0)
我可能误解了您的问题,但是似乎只需要以下未经测试的单行即可:
@git pull origin master 2>&1 1>CON|Find /V ""&&(Echo Ending script. Please fix the error then retry.&Pause>NUL&GoTo :EOF)||Pause