команда запуска пакетного файла не выполняет сценарий .vbs при запуске с рабочего стола, но может находиться в других папках, таких как загрузка или документы - PullRequest
0 голосов
/ 27 апреля 2020

ОБНОВЛЕНИЕ:

В соответствии с комментариями пользователя Mofi я переработал свой дизайн сценария. Я все еще не могу запустить этот скрипт на своем рабочем столе, как указано в моем исходном вопросе, но я работаю над выявлением проблемы с помощью Process Explorer, как он упоминал.

Ниже приведен обновленный скрипт. Если кому-то есть что предложить, дайте мне знать. Спасибо!

:: SCRIPT VERSION 2.0
:: REMOVED MOST OF THE SUBROUTINE SECTION
:: ELIMINATED THE NEED FOR MULTIPLE SETLOCAL INSTANCES
:: IMPROVED SCRIPT RELIABILITY

:: SCRIPT FIXES THE NEED FOR MULTIPLE SUPPORTING FILES TO WORK
:: PROMPTS THE USER TO CHOOSE WHICH BOOT OPTION THEY DESIRE
:: SAVE THIS SCRIPT WITH A .BAT EXT [NOT] WITH A .CMD EXT DUE TO HOW >>
:: >> EACH COMMAND PROCESSES THE CHOICE COMMAND'S %ERRORLEVELS%

:: THERE IS A CMD.EXE BUG THAT PREVENTS BATCH SCRIPTS RUNNING CORRECTLY IN THE USER DESKTOP FOLDER %ONEDRIVE%\DESKTOP
:: IF YOU EXPERIENCE THIS RUN THE SCRIPT LITERALLY ANYWHERE ELSE.

:: CHOOSE THE FOLLOWING OPTIONS
:: [SAFE MODE]
:: [SAFE MODE WITH NETWORKING]
:: [SAFE MODE WITH COMMAND PROMPT]
:: [EXIT SAFE MODE]
:: [EXIT SCRIPT]

:: SCRIPT WILL CREATE TEMPORARY SUPPORTING VBS SCRIPTS AND DELETE THEM WHEN DONE
:: RUN THE SCRIPT [ANYWHERE] YOU LIKE UNLESS YOU HAVE THE ABOVE STATED DESKTOP BUG
:: YOU MUST [ALWAYS] RUN THE SCRIPT AS AN [ADMINISTRATOR]

:: BEGIN SCRIPT

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
PROMPT $G
COLOR 0A
TITLE Enter or Exit Safe Mode

PUSHD "%~dp0"

ECHO.
ECHO :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
ECHO :                                                                     :
ECHO :                       Enter Or Exit Safe Mode                       :
ECHO :                                                                     :
ECHO :             Please save ALL open work before continuing             :
ECHO :                                                                     :
ECHO :         By: SlyFox1186                                              :
ECHO :         https://pastebin.com/u/slyfox1186                           :
ECHO :         https://stackoverflow.com/users/10572786/slyfox1186         :
ECHO :                                                                     :
ECHO :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
ECHO.
PAUSE

:: PROMPT USER WITH CHOICES FIRST RUN
CLS && ECHO.
ECHO :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
ECHO :                                                                     :
ECHO :  Select a boot mode:                                                :
ECHO :                                                                     :
ECHO :  [1] Safe Mode                                                      :
ECHO :  [2] Safe Mode with Networking                                      :
ECHO :  [3] Safe Mode with Command Prompt                                  :
ECHO :  [4] Exit Safe Mode                                                 :
ECHO :  [5] Exit Script                                                    :
ECHO :                                                                     :
ECHO ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: && GOTO FirstChoice

:: BEGIN SCRIPT RESTART
:: KILL ANY LEFTOVER PROCESS STILL RUNNING FROM PRIOR RUN TO AVOID ISSUES
:Restart
CLS && ECHO.
TASKLIST /FI "IMAGENAME EQ wlrmdr.exe" 2> NUL | FIND /I /N "wlrmdr.exe" >NUL
IF ERRORLEVEL 1 GOTO hungProcess
  TASKKILL /F /IM wlrmdr.exe /T
:hungProcess
TASKLIST /FI "IMAGENAME EQ wscript.exe" 2> NUL | FIND /I /N "wscript.exe" >NUL
IF ERRORLEVEL 1 GOTO FirstChoice
    TASKKILL /F /IM wscript.exe /T
    TIMEOUT 1 /NOBREAK >NUL

:: PROMPT USER WITH CHOICES SEQENTIAL RUNS
:FirstChoice
CLS && ECHO.
ECHO :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
ECHO :                                                                     :
ECHO :  Select a boot mode:                                                :
ECHO :                                                                     :
ECHO :  [1] Safe Mode                                                      :
ECHO :  [2] Safe Mode with Networking                                      :
ECHO :  [3] Safe Mode with Command Prompt                                  :
ECHO :  [4] Exit Safe Mode                                                 :
ECHO :  [5] Exit Script                                                    :
ECHO :                                                                     :
ECHO ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: && ECHO.

CHOICE /C 12345 /N

:: CHOICE COMMAND: EXIT SCRIPT
IF ERRORLEVEL 5 GOTO :EOF

:: CHOICE COMMAND: EXIT SAFE MODE
IF NOT ERRORLEVEL 4 GOTO TryCMD
(
ECHO IF WScript.Arguments.length = 0 Then
ECHO Set objShell = CreateObject^("Shell.Application"^)
ECHO objShell.ShellExecute "wscript", Chr^(34^) ^& WScript.ScriptFullName ^& Chr^(34^) ^& " Run", , "RunAs", 1
ECHO Else
ECHO Set objShell2 = WScript.CreateObject^("WScript.Shell"^)
ECHO objShell2.Run "bcdedit /Deletevalue {current} safeboot",0,True
ECHO objShell2.Run "bcdedit /Deletevalue {current} safebootalternateshell",0,True
ECHO objShell2.Run "shutdown -r -t 60 -f", 0, True
ECHO End IF
ECHO Set objShell = Nothing
ECHO Set objShell2 = Nothing
)> %TEMP%\SafeEXIT.vbs && wscript %TEMP%\SafeEXIT.vbs
:RescanExit
  TIMEOUT 1 /NOBREAK >NUL
    TASKLIST /FI "IMAGENAME EQ wlrmdr.exe" 2> NUL | FIND /I /N "wlrmdr.exe" >NUL
    IF ERRORLEVEL 1 GOTO RescanExit
        TASKKILL /F /IM wlrmdr.exe && DEL /Q %TEMP%\SafeEXIT.vbs
  SET EchoEXIT=Exit Safe Mode ^&^& ECHO.
    CALL :ConfirmChoice "%EchoEXIT%" && EXIT /B
    GOTO :EOF

:: CHOICE COMMAND: SAFE MODE WITH COMMAND PROMPT
:TryCMD
IF NOT ERRORLEVEL 3 GOTO TryNET
(
ECHO IF WScript.Arguments.length = 0 Then
ECHO Set objShell = CreateObject^("Shell.Application"^)
ECHO objShell.ShellExecute "wscript", Chr^(34^) ^& WScript.ScriptFullName ^& Chr^(34^) ^& " Run", , "RunAs", 1
ECHO Else
ECHO Set objShell2 = WScript.CreateObject^("WScript.Shell"^)
ECHO objShell2.Run "bcdedit /set {current} safeboot minimal",0,True
ECHO objShell2.Run "bcdedit /set {current} safebootalternateshell yes",0,True
ECHO objShell2.Run "shutdown -r -t 60 -f", 0, True
ECHO End IF
ECHO Set objShell = Nothing
ECHO Set objShell2 = Nothing
)> %TEMP%\SafeCMD.vbs && wscript %TEMP%\SafeCMD.vbs
:RescanCMD
    TIMEOUT 1 /NOBREAK >NUL
    TASKLIST /FI "IMAGENAME EQ wlrmdr.exe" 2> NUL | FIND /I /N "wlrmdr.exe" >NUL
    IF ERRORLEVEL 1 GOTO RescanCMD
        TASKKILL /F /IM wlrmdr.exe && DEL /Q %TEMP%\SafeCMD.vbs
  SET EchoCMD=Safe Mode with Command Prompt ^&^& ECHO.
    CALL :ConfirmChoice "%EchoCMD%" && EXIT /B
    GOTO :EOF

:: CHOICE COMMAND: SAFE MODE WITH NETWORKING
:TryNET
IF NOT ERRORLEVEL 2 GOTO TrySAFE
(
ECHO IF WScript.Arguments.length = 0 Then
ECHO Set objShell = CreateObject^("Shell.Application"^)
ECHO objShell.ShellExecute "wscript", Chr^(34^) ^& WScript.ScriptFullName ^& Chr^(34^) ^& " Run", , "RunAs", 1
ECHO Else
ECHO Set objShell2 = WScript.CreateObject^("WScript.Shell"^)
ECHO objShell2.Run "bcdedit /set {current} safeboot network",0,True
ECHO objShell2.Run "shutdown -r -t 60 -f", 0, True
ECHO End IF
ECHO Set objShell = Nothing
ECHO Set objShell2 = Nothing
)> %TEMP%\SafeNET.vbs && wscript %TEMP%\SafeNET.vbs
:RescanNET
    TIMEOUT 1 /NOBREAK >NUL
    TASKLIST /FI "IMAGENAME EQ wlrmdr.exe" 2> NUL | FIND /I /N "wlrmdr.exe" >NUL
    IF ERRORLEVEL 1 GOTO RescanNET
        TASKKILL /F /IM wlrmdr.exe /T && DEL /Q %TEMP%\SafeNET.vbs
    SET EchoNET=Safe Mode with Networking ^&^& ECHO.
    CALL :ConfirmChoice "%EchoNET%" && EXIT /B
    GOTO :EOF

:: CHOICE COMMAND: SAFE MODE
:TrySAFE
IF NOT ERRORLEVEL 1 GOTO :EOF
(
ECHO IF WScript.Arguments.length = 0 Then
ECHO Set objShell = CreateObject^("Shell.Application"^)
ECHO objShell.ShellExecute "wscript", Chr^(34^) ^& WScript.ScriptFullName ^& Chr^(34^) ^& " Run", , "RunAs", 1
ECHO Else
ECHO Set objShell2 = WScript.CreateObject^("WScript.Shell"^)
ECHO objShell2.Run "bcdedit /set {current} safeboot minimal",0,True
ECHO objShell2.Run "shutdown -r -t 60 -f", 0, True
ECHO End IF
ECHO Set objShell = Nothing
ECHO Set objShell2 = Nothing
)> %TEMP%\SafeMODE.vbs && wscript %TEMP%\SafeMODE.vbs
:RescanSAFE
  TIMEOUT 1 /NOBREAK >NUL
    TASKLIST /FI "IMAGENAME EQ wlrmdr.exe" 2> NUL | FIND /I /N "wlrmdr.exe" >NUL
    IF ERRORLEVEL 1 GOTO RescanSAFE
        TASKKILL /F /IM wlrmdr.exe && DEL /Q %TEMP%\SafeMODE.vbs
    SET EchoSafe=Safe Mode ^&^& ECHO.
    CALL :ConfirmChoice "%EchoSafe%" && EXIT /B
    GOTO :EOF

:: SUBROUTINE: CONFIRM CHOICE
:ConfirmChoice
CLS && ECHO.
ECHO You have chosen: %~1
TIMEOUT 2 /NOBREAK >NUL
ECHO [1] Continue shutdown
ECHO [2] Restart script
ECHO [3] Exit script && ECHO.

CHOICE /C 123 /T 10 /D 2 /N

:: SUBROUTINE: CONFIRM CHOICE - EXIT SCRIPT
CLS && ECHO.
IF ERRORLEVEL 3 SHUTDOWN /A && ENDLOCAL && GOTO :EOF

:: SUBROUTINE: CONFIRM CHOICE - RESTART SCRIPT
IF ERRORLEVEL 2 (
  SHUTDOWN /A
  ENDLOCAL
    GOTO Restart
    )

:: SUBROUTINE: CONFIRM CHOICE - CONTINUE SHUTDOWN
IF ERRORLEVEL 1 (
    ECHO Please wait few seconds for windows to reboot. && ECHO.
    TIMEOUT 2 /NOBREAK >NUL
    PAUSE && ENDLOCAL && GOTO :EOF
  )
...