в пакетном файле W10 'if errorlevel' не правильно оценивается, когда в блоке - PullRequest
0 голосов
/ 10 июня 2019

У меня проблемы с уровнем ошибки, всегда равным 0, если IF находится в блоке for

Я пробовал другой синтаксис%!etc

@Echo Off
rem no correct evaluation of IF ERRORLEVEL (syntax % or !)
setlocal enabledelayedexpansion

For /F Tokens^=6Delims^=^" %%A In ('WMIC Path Win32_ShortcutFile Where^
 "Extension='lnk' And Name Like '%AppData:\=\\%\\Microsoft\\Windows\\Recent\\%%'"^
 Get Target /Format:"MOF" 2^>Nul')Do For %%B In (odt pdf txt doc docx wpd wps csv swd vor uot uof pdb psw xls xlsx xlm wk1 wks 123 dif rtf sdc vor dbf slkppt pps pptx 
)Do If /I "%%~xA"==".%%B" If Exist "%%A" (
Echo(%%A
MailAlert -s "my PC MEDION" -r first.last@yahoo.be -b "recente" -a "%%A"

IF '!errorlevel!'=='0' (
    rem the IF is not executed ; neither with '%errorlevel%'=='0'
    rem   '%errorlevel%'=='0'   was tested succesfully  outside the for block !!
    echo isSend: %%A
    rem shortcut to be deleted 
) ELSE (
    ECHO "An error was found w/ error code of: %ERRORLEVEL%"
        rem  !! errorlevel was never correct (is always 0) although the if function was correctly evaluated (as beeiing not 0) but only outside the 'for' block !!! 
    ECHO "in file:%%A" 
    rem shortcut not to be deleted 
) 

)



вне блока for Я проверил код, отправив вложенный файл, который был открыт, и это вызвало ошибку (созданную mailalert), которая была хорошо обнаружена, если '% errorlevel% ==….. Другой файл, который не был открыт, был эффективно отправлен mailalert и вызвал уровень ошибки 0.

1 Ответ

0 голосов
/ 11 июня 2019
@echo off
setlocal enabledelayedexpansion

rem Following 4 lines are the powershell command
set pscommand=^&{^
$sh= New-Object -ComObject WScript.Shell;^
ForEach ($lnk in Get-ChildItem '!AppData!\Microsoft\Windows\Recent\*.lnk'^) {^
ForEach ($target in $sh.CreateShortcut($lnk^).TargetPath^) {Write-Host $lnk'^|'$target}}}

for /f "tokens=1-2 delims=|" %%A in ('powershell -noprofile -command "!pscommand!"') do (
    rem Disable delayed expansion as can remove exclaimation marks in paths.
    setlocal disabledelayedexpansion

    for %%C In (
        odt pdf txt doc docx wpd wps csv swd vor
        uot uof pdb psw xls xlsx xlm wk1 wks 123
        dif rtf sdc vor dbf slkppt pps pptx
    ) do (
        if /i "%%~xB" == ".%%~C" if exist "%%~B" (
            echo(Link:   "%%~A"& echo(Target: "%%~B"

            rem Attach .lnk file to mail
            MailAlert -s "my PC MEDION" -r first.last@yahoo.be -b "recente" -a "%%~A"

            if errorlevel 1 (
                rem Shortcut not to be deleted

                rem Backup errorlevel using call set to resolve the doubled percent signs.
                call set "error_level=%%errorlevel%%"

                rem Enable delayed expansion to echo the backup of errorlevel
                setlocal enabledelayedexpansion
                echo An error was found w/ error code of: !error_level!
                endlocal

                echo inFile: "%%~B"
            ) else (
                rem Shortcut to be deleted
                echo del "%%~A"

                echo isSend: "%%~B"
            )
            echo(
        )
    )

    endlocal
)

Здесь показано, как сделать резервную копию errorlevel в другой переменной и использовать ее после установки setlocal, так как setlocal может установить errorlevel.

Если echo изerrorlevel важно, я бы пропустил его, так как это единственная именованная переменная, которая нуждается в расширении в цикле for.Без этого не потребовалось бы расширение, требующее включения отложенного расширения, или call set, или call echo.Код показывает только 1 вариант для echo из errorlevel.

. Пути могут иметь восклицательные знаки, поэтому включение отложенного расширения, когда пути раскрываются как текст, может привести к исчезновению восклицательных знаков на пути,что делает затронутые пути недействительными.Чтобы избежать этого, включите и отключите отложенное расширение по мере необходимости.

Я нашел wmic довольно медленным, поскольку он выполняет поиск по всей системе и не дал результатов с вашим кодом, поэтому я использую powershell для чтения целей из.lnk файлы.Если необходимо, это замена wmic.

Переменные for:

  • %%A - это путь ссылки
  • %%Bцелевой путь
  • %%C - это расширения для сравнения с расширениями целевого пути

Просмотр if /? для получения информации об обработке errorlevel.Обратите внимание на проверку if errorlevel 1, которая не требует расширения переменных.

...