为什么批处理有时不能像CMD那样处理命令,并给出意外和不同的结果[重复] 。

问题描述 投票:0回答:1

当我直接从CMD中运行一个命令时,它工作得非常好,但是当在批处理文件中运行同样的命令时(或Jenkins使用批处理),它给我一个不同的结果,我不明白为什么。

简单的解释一下,我正在运行下面的命令来搜索一个日志文件中的文字字符串。

findstr /C:"MY STRING WITH A %variable%" M:\Logs\output.log

如果我检查结果的%ERRORLEVEL%,它显示了预期的值(0=找到了字符串或1=没有找到)。

然而,当我从批处理文件中运行同样的行,甚至从Jenkins中运行,结果总是0,即使该字符串不存在于日志中,%ERRORLEVEL%也总是0。

这就是批处理文件中包含命令的部分。

if %COUNTER% ==1 ( 
    if not exist M:\Logs\current_bak (
        ROBOCOPY "M:\Logs\tkcurrent" "M:\Logs\tkcurrent_bak"
        REN "M:\Logs\current" "M:\Logs\current_bak"
        MKDIR M:\Logs\current
        echo Folders have been backed up
    ) else (
        echo Back up folders are already in place )

    findstr /C:"MY STRING WITH A %variable%" M:\Logs\output.log
    if %ERRORLEVEL% == 0 (
        echo Process has already being kicked off for the files with date %YYMMDD%, skipping it...
        echo Download and backup compleated
        exit /b 0 )
    else (
        echo Triggering next Jenkins Job:  
        curl -I http://<user>:<token>@remoteserver.domain.com:<port>/job/Hello_World/build?token=hello_world
        exit /b 0 )
)

有没有人在过去经历过这种情况 或者能更好地指导我做错了什么或者不理解什么?

非常感谢!

batch-file jenkins cmd
1个回答
0
投票

你的错误是一个基本的语法错误,我也犯过很多次:P。问题出在你的 else 声明,这是一个特殊的问题,但发生的情况是。else 只有当它与那个 "我 "在同一条线上时,才会被处理。if 声明:


概念证明

如果我把if语句和else语句放在不同的行上,就像这样。

@echo off
echo test
if errorlevel 1 (echo here) 
else (echo not there)
pause

这样就会出现错误。

'else' is not recognized as an internal or external command,
operable program or batch file.

但是如果我稍微修改一下代码,让 else 和 if 在同一行,像这样:

@echo off
echo test
if errorlevel 1 (echo here
) else (echo not there)
pause

它就不会出现错误,并输出

test
not there


你的代码正确地完成了,将是。
if %COUNTER%==1 ( 
    if not exist M:\Logs\current_bak (
        ROBOCOPY "M:\Logs\tkcurrent" "M:\Logs\tkcurrent_bak"
        REN "M:\Logs\current" "M:\Logs\current_bak"
        MKDIR M:\Logs\current
        echo Folders have been backed up
    ) else (
        echo Back up folders are already in place )

    findstr /C:"MY STRING WITH A %variable%" M:\Logs\output.log
    if %ERRORLEVEL% == 0 (
        echo Process has already being kicked off for the files with date %YYMMDD%, skipping it...
        echo Download and backup compleated
        exit /b 0 
    ) else (
        echo Triggering next Jenkins Job:  
        curl -I http://<user>:<token>@remoteserver.domain.com:<port>/job/Hello_World/build?token=hello_world
        exit /b 0 )
)

关于这种类型的更多信息 if /? 到cmd中。

注:我还修正了你的代码中的一个错别字,即 findsrt 而不是 findstr

© www.soinside.com 2019 - 2024. All rights reserved.