Обновить текущий запущенный пакетный скрипт - PullRequest
0 голосов
/ 07 июня 2018

Снова играю с моим Batch-скриптом.Мне стало известно, что процедура обновления не работает должным образом.Итерация 1 приведет к удалению запущенного скрипта, а не к копированию новой версии из папки, которую я выбрал.Итерация 2 теперь удаляет старый сценарий и копирует новый сценарий, но с каждой строкой кода, которую я изменяю, я получаю закрытие текущего запущенного сценария, а новый обновленный сценарий не запускается.

Вот фрагмент обновлениярутина:

:Options
REM I'll set the variable here to what is set elsewhere in the script.
SET VERSION=Version 1.7
CLS
ECHO.
ECHO.
ECHO %VERSION%
ECHO. 
ECHO. 
ECHO ==================== OPTIONS =====================
ECHO.
ECHO     1. Update Script WIP
ECHO     2. Install entire script to Statup Folder
ECHO     3. Install individual items for auto-launch
ECHO     4. Install Windows Logout feature
ECHO     5. Uninstall
ECHO     6. Change Colors
ECHO     7. Changelog
ECHO.
ECHO =======PRESS 'Q' TO QUIT OR 'B' TO GO BACK========
ECHO.

SET OPTION=
SET /P OPTION=Select an Option:
IF /I '%OPTION%'=='1' GOTO Update
IF /I '%OPTION%'=='2' GOTO Install
IF /I '%OPTION%'=='3' GOTO I_Install
IF /I '%OPTION%'=='4' GOTO I_Logout
IF /I '%OPTION%'=='5' GOTO Uinstall
IF /I '%OPTION%'=='6' GOTO Colors
IF /I '%OPTION%'=='7' GOTO Changelog
IF /I '%OPTION%'=='q' GOTO quit
IF /I '%OPTION%'=='quit' GOTO quit
IF /I '%OPTION%'=='b' GOTO menu
IF /I '%OPTION%'=='back' GOTO menu

ECHO.
ECHO ============INVALID INPUT============
ECHO Please select a number
ECHO or select 'Q' or 'B'.
ECHO ======PRESS ANY KEY TO CONTINUE======

PAUSE > NUL
GOTO Options

:Update
ECHO.
IF EXIST "%appdata%\Microsoft\Windows\Start Menu\Programs\Startup\Shortcut Browser *.bat" (
  GOTO Update_1
  ) ELSE (
    ECHO You have not installed the script yet. Please install the script first.
  )    
PAUSE
GOTO Options

:Update_1
  IF EXIST "%userprofile%\AppData\Local\Temp\Update.bat" (
    GOTO Update_2
  )  ELSE  (
REM Here the main script writes an update script to a batch file
     ECHO DEL "%appdata%\Microsoft\Windows\Start Menu\Programs\Startup\Shortcut Browser *.bat" > "%userprofile%\AppData\Local\Temp\Update.bat"
REM I replaced the original file location with one on the desktop. The original location was on a network drive, location is confidential.
     ECHO COPY "%userprofile\Desktop\Shortcut Browser *.bat" "%appdata%\Microsoft\Windows\Start Menu\Programs\Startup" >> "%userprofile%\AppData\Local\Temp\Update.bat"
     ECHO CALL "%appdata%\Microsoft\Windows\Start Menu\Programs\Startup\Shortcut Browser *.bat" >> "%userprofile%\AppData\Local\Temp\Update.bat"
     ECHO EXIT >> "%userprofile%\AppData\Local\Temp\Update.bat"
  )
GOTO Update_2

REM Here the main script calls upon the update script
:Update_2
  CALL "%userprofile%\AppData\Local\Temp\Update.bat"
REM The script seems to hang here. Either both the scripts will remain open or close or a combination depending on where CALL and START were used.
  PAUSE
GOTO Options

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

Если вам нужна дополнительная информация, дайте мне знать.Я думаю, что я покрыл все.

1 Ответ

0 голосов
/ 09 июня 2018
@ECHO OFF
SETLOCAL
TITLE Super Script 5000

:Options
REM I'll set the variable here to what is set elsewhere in the script.
SET VERSION=Version 1.7
CLS
ECHO.
ECHO.
ECHO %VERSION%
ECHO.
ECHO.
ECHO ==================== OPTIONS =====================
ECHO.
ECHO     1. Update Script WIP
ECHO     2. Install entire script to Statup Folder
ECHO     3. Install individual items for auto-launch
ECHO     4. Install Windows Logout feature
ECHO     5. Uninstall
ECHO     6. Change Colors
ECHO     7. Changelog
ECHO.
ECHO =======PRESS 'Q' TO QUIT OR 'B' TO GO BACK========
ECHO.

SET "OPTION="
SET /P "OPTION=Select an Option: "
IF /I "%OPTION%"=="1" GOTO Update
IF /I "%OPTION%"=="2" GOTO Install
IF /I "%OPTION%"=="3" GOTO I_Install
IF /I "%OPTION%"=="4" GOTO I_Logout
IF /I "%OPTION%"=="5" GOTO Uinstall
IF /I "%OPTION%"=="6" GOTO Colors
IF /I "%OPTION%"=="7" GOTO Changelog
IF /I "%OPTION%"=="q" GOTO quit
IF /I "%OPTION%"=="quit" GOTO quit
IF /I "%OPTION%"=="b" GOTO menu
IF /I "%OPTION%"=="back" GOTO menu

ECHO.
ECHO ============INVALID INPUT============
ECHO Please select a number
ECHO or select 'Q' or 'B'.
ECHO ======PRESS ANY KEY TO CONTINUE======

PAUSE > NUL
GOTO Options

:Update
  ECHO.
  IF EXIST "%appdata%\Microsoft\Windows\Start Menu\Programs\Startup\Shortcut Browser *.bat" (
    GOTO Update_1
  ) ELSE (
    ECHO You have not installed the script yet. Please install the script first.
  )
  PAUSE
GOTO Options

:Update_1
  IF EXIST "%tmp%\update.bat" (
    2>NUL DEL "%tmp%\update.bat" || GOTO Options
  )

  SETLOCAL

  FOR %%A IN (
    "%appdata%\Microsoft\Windows\Start Menu\Programs\Startup\Shortcut Browser *.bat"
  ) DO (
    SET "old_version=%%~A"
    SET "old_dir=%%~dpA"
    SET "old_file=%%~nxA"
  )

  FOR %%A IN (
    "%userprofile%\Desktop\Shortcut Browser *.bat"
  ) DO (
    SET "new_version=%%~A"
    SET "new_dir=%%~dpA"
    SET "new_file=%%~nxA"
  )

  IF NOT DEFINED old_version (
    ENDLOCAL
    GOTO Options
  ) ELSE IF NOT DEFINED new_version (
    ENDLOCAL
    GOTO Options
  )

  (
    ECHO @ECHO OFF
    ECHO SETLOCAL
    ECHO.
    ECHO ECHO Update and restarting...
    ECHO ^>NUL PING localhost -n 3
    ECHO.
    ECHO SET "old_version=%old_version%"
    ECHO SET "new_version=%new_version%"
    ECHO SET "updated_version=%old_dir%\%new_file%"
    ECHO.
    ECHO CALL :log /clear_log
    ECHO.
    ECHO IF NOT EXIST "%%new_version%%" (
    ECHO   CALL :log ERROR: Not exist "%%new_version%%".
    ECHO   EXIT /B 1
    ECHO ^)
    ECHO.
    ECHO CALL :log Move old_version to old_version.bak.
    ECHO MOVE "%%old_version%%" "%%old_version%%.bak" ^|^| (
    ECHO   CALL :log ERROR: Move failed to backup old version.
    ECHO   EXIT /B 2
    ECHO ^)
    ECHO.
    ECHO CALL :log Copy new_version to old_version.
    ECHO COPY "%%new_version%%" "%%appdata%%\Microsoft\Windows\Start Menu\Programs\Startup\" ^|^| (
    ECHO   CALL :log ERROR: Copy failed. Restore old version.
    ECHO   MOVE "%%old_version%%.bak" "%%old_version%%" ^|^| (
    ECHO     CALL :log ERROR: Restore old version failed.
    ECHO     EXIT /B 3
    ECHO   ^)
    ECHO   EXIT /B 4
    ECHO ^)
    ECHO.
    ECHO CALL :log Delete old_version.bak.
    ECHO DEL "%%old_version%%.bak" ^|^| (
    ECHO   CALL :log WARNING: Delete backup file failed.
    ECHO ^)
    ECHO.
    ECHO IF NOT EXIST "%%updated_version%%" (
    ECHO   CALL :log ERROR: Not exist: "%%updated_version%%"
    ECHO   EXIT /B 5
    ECHO ^)
    ECHO.
    ECHO ENDLOCAL
    ECHO.
    ECHO ECHO Ready to restart updated version
    ECHO PAUSE
    ECHO CALL "%old_dir%\%new_file%"
    ECHO EXIT /B
    ECHO.
    ECHO :log
    ECHO   SETLOCAL
    ECHO   SET "log=%%tmp%%\update.log"
    ECHO   IF /I "%%~1"=="/clear_log" TYPE NUL ^> "%%log%%" ^& EXIT /B
    ECHO   IF /I "%%~1"=="/delete_log" 2^>NUL DEL "%%log%%" ^& EXIT /B
    ECHO   SET args=%%*
    ECHO   IF NOT DEFINED args EXIT /B
    ECHO   ECHO %%*
    ECHO   ^>^> "%%log%%" ECHO %%*
    ECHO EXIT /B
  ) > "%tmp%\update.bat"
  ENDLOCAL

  START "Super Script 5000" "cmd /c "%tmp%\update.bat""
EXIT

:Quit

Протестировано на Win7 VM .Сценарий должен быть перезапущен при обновлении, иначе могут возникнуть странные проблемы.CMD не любит изменение сценариев, так как читает и интерпретирует их.Даже повторное использование одной и той же консоли с использованием START с /B может вызвать проблемы с клавишным вводом.

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

update.bat перемещает старую версию в файл .bak, копирует новую версию и в случае успеха удаляет файл .bak, в противном случае перемещает.bak файл до старой версии.Это просто для того, чтобы текущая версия всегда существовала, даже если обновление не удалось.

Изменены кавычки в метке :Options с ' до ".Цитаты не являются взаимозаменяемыми, как некоторые другие языки.Пример: "%OPTION%" будет работать, если будет содержать пробел, хотя '%OPTION%' может вызвать ошибку.

Я не вижу SETLOCAL в верхней части вашего полного сценария.Советуем вам добавить его, если у вас нет веских причин не делать этого.

Я объединил ярлыки :Update_1 и :Update_2 в один.

Возможно, откорректируйте число Ping localhost -n, если время будет больше или меньшеНужно.

Посмотрите на %tmp%\update.log, если возникнет проблема.Хотя ожидайте, что ошибки будут отображаться в консоли, поскольку метка :log в update.bat отражается в консоли и записывается в журнал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...