Мне нужна помощь с пакетным сценарием Windows / CMD. Я написал сценарий для записи микрофона в MP3 в течение 12 часов. Он работает нормально при запуске вручную. Он также будет работать с планировщиком задач - просто вместо ожидания 12 часов он завершится после последнего оператора.
Ниже приведен код,
@ECHO OFF
REM You will need to change the extension, and the verify the %DATE% format.
REM XT= Extension, eg. 55109
SET XT=55109
REM TA= Sales Rep, eg. John Smith
SET TA=John Smith
REM TY= Year, eg. 2013
SET TY=%DATE:~0,4%
REM TM= Month, eg. 04
SET TM=%DATE:~5,2%
REM TD= Dat, eg. 29
SET TD=%DATE:~8,2%
REM TE= Time in 24 hour format, eg. 1730
SET TE=%TIME:~0,2%%TIME:~3,2%
REM FL= File location.
SET FL=\\Server2\Recording$
REM TL= Album Title, no space.
SET TL=ACME
REM TV= Drive letter
SET TV=P:
REM Do not change anything below this line.
SET BT=16
SET SR=16
SET CH=2
SET RS=16000
TASKLIST /FI "IMAGENAME eq lame.exe" 2> NUL | FIND /I /N "lame.exe" > NUL
IF NOT "%ERRORLEVEL%" == "0" (
SET TH=%TY%%TM%
SET TT=%TY%%TM%%TD%
SET OU=P:\%TT%-%TE%-%XT%.mp3
SET PR="%PROGRAMFILES(X86)%\Recorder"
IF EXIST %TV%\ ( NET USE %TV% /DELETE /Y > NUL )
NET USE %TV% %FL% /PERSISTENT:NO > NUL
IF NOT EXIST %TV%\%XT% ( MKDIR %TV%\%XT% )
IF NOT EXIST %TV%\%XT%\%TH% ( MKDIR %TV%\%XT%\%TH% )
NET USE %TV% /DELETE /Y > NUL
NET USE %TV% %FL%\%XT%\%TH% /PERSISTENT:NO > NUL
%PR%\linco.exe -B %BT% -C %CH% -R %RS% -D 12:00:00 | %PR%\lame.exe -r -s %SR% -m s -a -q 5 -c --bitwidth %BT% --tt "%TT%"-"%XT%" --ta "%TA%" --tl %TL% --ty %TY% --tg Recording - -o %OU%
) ELSE (
ECHO Warning: Recorder already started.
TASKLIST /FI "IMAGENAME eq lame.exe"
)
EXIT
Есть идеи, пожалуйста? Большое спасибо!
Ресурсов по описанной проблеме много - например Переменные в пакете работают не так, как ожидалось:
Вы не первый, кто попал в знаменитую «ловушку отложенного расширения» (и не последний)
Тебе нужно отложенное расширение если вы хотите использовать переменную, которую вы изменили в том же блоке (блок - это последовательность команд в скобках (и))
Переменные с задержкой обозначаются
!var!
вместо того%var%
Причина в том, как cmd разбирает код. Вся строка или блок анализируется сразу, при этом обычные переменные заменяются их значениями во время анализа. Переменные с задержкой оцениваются во время выполнения.
Две простые партии для демонстрации:
setlocal enabledelayedexpansion set "var=hello" if 1==1 ( set "var=world" echo %var% !var! )
.
for /L %%i in (1,1,5) do ( echo %random% !random! )
…
По-другому без использования setlocal enabledelayedexpansion
: использовать call
подпрограмма, например следующим образом:
@ECHO OFF
REM You will need to change the extension, and the verify the %DATE% format.
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::
:: unchanged code snippet here
::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
TASKLIST /FI "IMAGENAME eq lame.exe" 2> NUL | FIND /I /N "lame.exe" > NUL
IF NOT "%ERRORLEVEL%" == "0" (
CALL :runexe
) ELSE (
ECHO Warning: Recorder already started.
TASKLIST /FI "IMAGENAME eq lame.exe"
)
EXIT
:runexe
SET TH=%TY%%TM%
SET TT=%TY%%TM%%TD%
SET OU=P:\%TT%-%TE%-%XT%.mp3
SET PR="%PROGRAMFILES(X86)%\Recorder"
IF EXIST %TV%\ ( NET USE %TV% /DELETE /Y > NUL )
NET USE %TV% %FL% /PERSISTENT:NO > NUL
IF NOT EXIST %TV%\%XT% ( MKDIR %TV%\%XT% )
IF NOT EXIST %TV%\%XT%\%TH% ( MKDIR %TV%\%XT%\%TH% )
NET USE %TV% /DELETE /Y > NUL
NET USE %TV% %FL%\%XT%\%TH% /PERSISTENT:NO > NUL
%PR%\linco.exe -B %BT% -C %CH% -R %RS% -D 12:00:00 | %PR%\lame.exe -r -s %SR% -m s -a -q 5 -c --bitwidth %BT% --tt "%TT%"-"%XT%" --ta "%TA%" --tl %TL% --ty %TY% --tg Recording - -o %OU%
goto :eof