Я собрал пакетный файл (CMD), который мы используем для проверки различных вещей на некоторых серверах. То, что публикуется ниже, это почти все (за исключением конфиденциальной информации). Если пакет запущен с правильной командной строкой, пакетный файл продолжит проверять день и время его запуска. Таким образом, мы можем поместить его в папку STARTUP на наших серверах, и при входе в систему он запускается, и если пользователь входит в систему в рабочий день с 06:45 до 07:30, выполняются определенные проверки (т. Е. Внешние приложения запускаются и т. д.). Выборочно, правильное приложение запускается на основе переменных среды, таких как COMPUTERNAME, USERNAME (которые были удалены в приведенном ниже коде) и т.д.
Один из процессов, который нам нужно запустить, требует повышения прав (IISRESET). Чтобы сделать это в пакетном файле, я использовал пример, показанный Мэттом (спасибо), который можно найти на https://stackoverflow.com/questions/7044985/how-can-i-auto-elevate-my-batch-file-so. -это-запросы-от-uac-admin-права. Я не хотел публиковать в этой теме, потому что это новая тема. В пакетном файле, который я предоставил ниже, он работает должным образом (как бы то ни было, никаких гарантий или гарантий не подразумевается). Но если я уберу символы «комментарий» (двойные двоеточия), изменив:
:BEGIN
If %COMPUTERNAME%==SERVER1 explorer.exe "c:\queue"
:: If %COMPUTERNAME%==SERVER1 Goto CHECKPRIVILEGES
If %COMPUTERNAME%==SERVER2 explorer.exe "c:\queue"
:: If %COMPUTERNAME%==SERVER2 Goto CHECKPRIVILEGES
:COMMON
...(в)...
:BEGIN
If %COMPUTERNAME%==SERVER1 explorer.exe "c:\queue"
If %COMPUTERNAME%==SERVER1 Goto CHECKPRIVILEGES
If %COMPUTERNAME%==SERVER2 explorer.exe "c:\queue"
If %COMPUTERNAME%==SERVER2 Goto CHECKPRIVILEGES
:COMMON
... тогда пакетный файл не работает должным образом. Когда я удаляю комментарии из двух строк, пакетный файл перестает правильно оценивать переменные (запускаются ли они вручную или как часть процесса STARTUP). Хотя командный файл заявляет:
If %COMPUTERNAME%==SERVER1
If %COMPUTERNAME%==SERVER2
… Команда, связанная с SERVER1, выполняется правильно, но SERVER2 выполняет команды, связанные как с SERVER1, так и с SERVER2. Затем пакетный файл останавливается и никогда не выполняет ни одной из команд в разделе COMMON:
:COMMON
explorer.exe /e,
Start services.msc
…так далее…
Я протестировал несколько сценариев, и я знаю, что я пропускаю что-то простое прямо перед моим лицом. Кто-нибудь может увидеть, что не так с командным файлом ниже?
Спасибо
-------------------------------------------------- -----------
Полный пакетный файл:
@Echo Off
:: ***** If not started using "-Login" with the cmd line then we won't even check the day or time *****
:: ***** We won't even consider what day or time it is if we run this CMD file manually *****
Set LaunchString=%1%
If [%LaunchString%] equ [] Goto BEGIN Rem ***** No parameters given *****
Call :UPCASE LaunchString
If not %LaunchString% equ -LOGIN Goto BEGIN
:: ***** See if we're running on a normal business weekday *****
:: ***** That way we can put this in server startup to run automatically at login during certain times *****
For /F "tokens=1 delims= " %%A IN ('Date /t') DO @(Set DayName=%%A)
If %DayName:~0,3% equ Mon Goto CONTINUE
If %DayName:~0,3% equ Tue Goto CONTINUE
If %DayName:~0,3% equ Wed Goto CONTINUE
If %DayName:~0,3% equ Thu Goto CONTINUE
If %DayName:~0,3% equ Fri Goto CONTINUE
Goto FINISH Rem ***** Not a business day so exit *****
:CONTINUE
:: Check if the time is between 06:45 and 07:30 and if not then exit otherwise continue processing
Setlocal enableextensions enabledelayedexpansion
Set tm=%time%
Set hh=!tm:~0,2!
Set mm=!tm:~3,2!
If !hh! equ 6 ( :: Hour is 6 (i.e., 06:xx AM)
If not !mm! gtr 44 ( :: - Since hour is 6, are minutes greater than 44 (i.e., after 06:45)?
Goto FINISH
)
) else If !hh! equ 7 ( :: Hour is 7 (i.e., 07:xx AM)
If not !mm! lss 30 ( :: - Since hour is 7, are minutes less than 31 (i.e., before 07:30)?
Goto FINISH
)
) else Goto FINISH
Endlocal
:: If manually launched without command line argument then we start here (no day or time check)
:BEGIN
If %COMPUTERNAME%==SERVER1 explorer.exe "c:\queue"
:: If %COMPUTERNAME%==SERVER1 Goto CHECKPRIVILEGES
If %COMPUTERNAME%==SERVER2 explorer.exe "c:\queue"
:: If %COMPUTERNAME%==SERVER2 Goto CHECKPRIVILEGES
:COMMON
explorer.exe /e,
Start services.msc
:: ***** Check if test file exists *****
If Exist "c:\test.log" Start c:\programA.exe
If Exist "d:\test.log" Start c:\programB.exe
:FINISH
Exit /B
Goto:EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Subroutine - Convert a variable VALUE to all UPPER CASE.
:UPCASE
For %%i IN ("a=A" "b=B" "c=C" "d=D" "e=E" "f=F" "g=G" "h=H" "i=I" "j=J" "k=K" "l=L" "m=M" "n=N" "o=O" "p=P" "q=Q" "r=R" "s=S" "t=T" "u=U" "v=V" "w=W" "x=X" "y=Y" "z=Z") DO Call Set "%1=%%%1:%%~i%%"
Goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Subroutine - Elevate permissions to run IISRESET
:CHECKPRIVILEGES
Net FILE 1>NUL 2>NUL
If '%errorlevel%' == '0' ( Goto gotPrivileges ) else ( Goto getPrivileges )
:GETPRIVILEGES
If '%1'=='ELEV' (shift & goto gotPrivileges)
Setlocal DisableDelayedExpansion
Set "batchPath=%~0"
Setlocal EnableDelayedExpansion
ECHO Set UAC = CreateObject^("Shell.Application"^) > "%temp%\OEgetPrivileges.vbs"
ECHO UAC.ShellExecute "!batchPath!", "ELEV", "", "runas", 1 >> "%temp%\OEgetPrivileges.vbs"
"%temp%\OEgetPrivileges.vbs"
:: Del "%temp%\OEgetPrivileges.vbs"
Exit /B
:GOTPRIVILEGES
Setlocal & pushd .
CMD /k iisreset
Goto :EOF