IF блок и переменные - финальный ELSE всегда выполняется, а не первая часть - PullRequest
0 голосов
/ 18 марта 2020

Я пишу пакетный скрипт, который проверяет, открыт ли FireFox, затем, в зависимости, копирует профиль в другую папку (в основном, резервная копия).

Сценарий ниже работает, если FF закрыт, но не открыто. Если он открыт, когда я запускаю его, я всегда получаю ответ ELSE () в конце и не могу понять, почему. Я довольно новичок в пакетных файлах, но искал вокруг и не могу понять, почему это не работает. Моя догадка - errorlevel, поэтому value не устанавливается должным образом ...

set source = "C:\users\someUser\someFolder\FireFox\Profiles\wszashe.default"
set destination = "C:\users\someUser\someOtherFolder\"
@echo off

tasklist /FI "IMAGENAME eq firefox.exe" 2>NUL | find /I /N "firefox.exe">NUL
IF "%ERRORLEVEL%"=="0" (
    echo wscript.quit MsgBox("Want to close FireFox?", 4, "Please choose."^) > yesno.vbs
    wscript //nologo yesno.vbs
    set value = %ERRORLEVEL%
    del yesno.vbs
) ELSE (
    robocopy %source% %destination% /e
    cls
    echo Profile Backed up.
    Exit
)

If "%value%"=="6" (
    taskkill /im "firefox.exe"
    robocopy %source% %destination% /e
    start "" "C:\Program Files\FireFox\firefox.exe"
    echo FireFox restarted.
) ELSE (  # This always seems to execute even if I choose "yes" from the msgbox above.
    echo wscript.quit MsgBox("Will not close FF and not back up profile.", 0, "Keep open"^) > nocopy.vbs
    wscript //nologo nocopy.vbs
    del nocopy.vbs
)

Если FireFox закрыт, он запускает блок, в который копирует папку, и затем выходит из script.

Однако, если он открыт, я не уверен, как получить %valueerror% для чтения. Если FireFox открыто, я просто хочу спросить пользователя, хотят ли они, чтобы оно было закрыто или нет. Если это так, то завершите процесс, скопируйте информацию и перезапустите его. В противном случае просто покажите простое сообщение о том, что оно не закроется, и завершите сценарий.

Ответы [ 2 ]

1 голос
/ 18 марта 2020
@echo off
setlocal enableDelayedExpansion
set "source=C:\users\someUser\someFolder\FireFox\Profiles\wszashe.default"
set "destination=C:\users\someUser\someOtherFolder\"

tasklist /FI "IMAGENAME eq firefox.exe" 2>nul | find /I "firefox.exe" >nul
if %ERRORLEVEL% equ 0 (
    > yesno.vbs echo wscript.quit MsgBox("Want to close FireFox?", 4, "Please choose."^)
    wscript //nologo yesno.vbs
    set "value=!ERRORLEVEL!"
    del yesno.vbs

    if !value! equ 6 (
        taskkill /F /FI "firefox.exe"
        robocopy "%source%" "%destination%" /e
        start "" "%ProgramFiles%\FireFox\firefox.exe"
        echo FireFox restarted.
    ) else (
        > nocopy.vbs echo wscript.quit MsgBox("Will not close FF and not back up profile.", 0, "Keep open"^)
        wscript //nologo nocopy.vbs
        del nocopy.vbs
    )
) else (
    robocopy "%source%" "%destination%" /e
    cls
    echo Profile Backed up.
    exit /b 0
)

Исправления:

  • Установка значений для имен переменных:

    set source = "..."
    

    равно %source % и "..." с начальным пробелом, как буквенные имена и значения могут включать в себя пробелы как часть их.

    Поэтому используйте:

    set "source=..."
    

    и добавляйте кавычки позже, когда вы используете переменную. Вокруг имени или значения нет пробелов.

  • Проверьте целые числа без кавычек и используйте equ. Строки могут работать при использовании ==, хотя работа с целыми числами может измениться, если вы используете lss et c. Поэтому измените:

    if "!value!" == "6" (
    

    на

    if !value! equ 6 (
    
  • Я уже упоминал об использовании кавычек позже, измените:

    robocopy %source% %destination% /e
    

    на

    robocopy "%source%" "%destination%" /e
    
  • Чтобы избежать повторения запаздывающих пробелов с примером:

    echo ... > yesno.vbs
    

    поставьте перенаправление перед командой:

    > yesno.vbs echo ...
    

Чтобы закрыть cmd.exe, используйте exit. Чтобы закрыть batch-file, используйте exit /b. Обратитесь за помощью к exit /?.

Я удалил аргумент /N из find, поскольку он устарел, поскольку вы просто хотите найти firefox.exe и проверить %ERRORLEVEL%.

0 голосов
/ 18 марта 2020

Я думаю Я нашел правильное решение. Я думаю, что это был способ, которым скрипт обрабатывает переменные при компиляции. Изменяя блоки IF и добавляя setlocal enableDelayedExpansion к вершине, кажется, что теперь работает:

setlocal enableDelayedExpansion
set source = "C:\users\someUser\someFolder\FireFox\Profiles\wszashe.default"
set destination = "C:\users\someUser\someOtherFolder\"
@echo off

tasklist /FI "IMAGENAME eq firefox.exe" 2>NUL | find /I /N "firefox.exe">NUL
IF "%ERRORLEVEL%"=="0" (
    echo wscript.quit MsgBox("Want to close FireFox?", 4, "Please choose."^) > yesno.vbs
    wscript //nologo yesno.vbs
    set value = !ERRORLEVEL!
    del yesno.vbs

    If "!value!"=="6" (
        taskkill /F /FI "firefox.exe"
        robocopy %source% %destination% /e
        start "" "C:\Program Files\FireFox\firefox.exe"
        echo FireFox restarted.
    ) ELSE (
        echo wscript.quit MsgBox("Will not close FF and not back up profile.", 0, "Keep open"^) > nocopy.vbs
        wscript //nologo nocopy.vbs
        del nocopy.vbs
    )
) ELSE (
    robocopy %source% %destination% /e
    cls
    echo Profile Backed up.
    Exit
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...