繁体   English   中英

在批处理脚本中首次执行Powershell不会设置正确的错误级别

[英]First execution of powershell in a batch script does not set correct error level

为什么批处理脚本在第一次执行该代码时,不会得到由执行的powershell代码设置的错误级别,而在随后的时间中却没有得到?

观察到以下内容:

  • 没有错误0 [这是错误的]
  • 预期错误2
  • 预期错误2
  • 预期错误2
  • 预期错误2

在每种情况下,下面的批处理脚本都会从自身内部执行一小部分嵌入式powershell代码。

exit 2;

Powershell第一次返回时,%ERRORLEVEL%为0。第二到第五次,%ERRORLEVEL%为2。

<# : 
@echo off
setlocal EnableDelayedExpansion

set DEPENDENCY_DIRNAME=dependencies2

set LINKS[0]=http://www.ijg.org/files/jpegsr8c.zip
set LINKS[1]=http://downloads.xiph.org/releases/ogg/libogg-1.2.2.zip
set LINKS[2]=http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.2.zip
set LINKS[3]=http://www.libsdl.org/projects/SDL_net/release/SDL_net-1.2.7.zip
set LINKS[4]=http://www.libsdl.org/release/SDL-1.2.14.zip

SET BUILD_PATH=%~dp0
SET BUILD_SCRIPT_FILENAME=%~nx0

set FILES[0]=

SET /A IDX=0
:loop1processlinks
set LINK=!LINKS[%IDX%]!
if "!LINK!" EQU "" goto processlinkedfiles

:loop2processlink
if "!LINK!" EQU "" goto loop0continue
for /f "delims=/" %%M in ("!LINK!") do set SUBSTRING=%%M

:loop3strip
set CHAR=!LINK:~0,1!
set LINK=!LINK:~1!
if "!LINK!" EQU "" goto foundfile
if "!CHAR!" NEQ "/" goto loop3strip
goto loop2processlink

:foundfile
set FILES[%IDX%]=!SUBSTRING!
goto loop2processlink

:loop0continue
set /A IDX=!IDX!+1
goto loop1processlinks

:processlinkedfiles

set /A IDX=0
:loop_processlinkedfiles
set LINK=!LINKS[%IDX%]!
set FILE=!FILES[%IDX%]!
if "!LINK!" EQU "" goto done

if "%FILE:~-4%" EQU ".zip" (
    REM Reset error level.
    verify > nul
    more %BUILD_PATH%%0 | powershell -c -
    if %ERRORLEVEL% neq 0 (
        echo Error as expected %ERRORLEVEL%
    ) else (
        echo No error %ERRORLEVEL% [this is wrong]
    )
)

set /A IDX=!IDX!+1
goto loop_processlinkedfiles

:done
cd %BUILD_PATH%

endlocal & exit /b
#>

exit 2;
if "%FILE:~-4%" EQU ".zip" (
    REM Reset error level.
    verify > nul
    more %BUILD_PATH%%0 | powershell -c -
    if !ERRORLEVEL! neq 0 (
        echo Error as expected !ERRORLEVEL!
        CALL echo Error as expected %%ERRORLEVEL%%
    ) else (
        echo No error !ERRORLEVEL! [this is wrong]
        CALL echo No error %%ERRORLEVEL%% [this is wrong]
    )
)

在块语句(a parenthesised series of statements) ,将分析整个然后执行。 解析该块时-执行该块之前-该块内的任何%var%都将由该变量的值替换-同样的情况也适用于FOR ... DO (block)

因此,将在遇到IF时使用%variables%的值执行IF (something) else (somethingelse)

解决此问题的两种常用方法是:1)使用setlocal enabledelayedexpansion和使用!var! 代替%var%访问的改变值var或2),以调用一个子程序使用改变的值来执行进一步的处理。

因此请注意,使用的CALL ECHO %%var%% ,其显示的改变值var 显示CALL ECHO %%errorlevel%% ,但遗憾的是随后出现了RESETS错误级别。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM