![Компьютерный форум OSzone.net](images/oszone.net.print.gif) |
|
Сложение двух строк в bat - файле
Здравствуйте, стоит такая задача: проигрывателю mpc-hc нужно передать через параметр папки для создания списка воспроизведения. Для этого использую скрипт, но проигрыватель не умеет воспроизводить то, что лежит в подпапке, поэтому использую цикл для перебора всех папок внутри указанной.
Код:
@echo off
title Test Media Player Classic
if "%~1"=="" (
echo No settings are acctepded
goto :end)
if "%~x1"=="" (
echo Parameter is not a directory!
goto :end)
set muz=%1
echo muz=%muz%
set param="/add "+%muz%
echo Checking subdirectory...
for /r %muz% /d %%f in (*) do (
echo %%f founded!
%param%=%param%+"/add "+%%f+" ")
cd "C:\Program Files\K-Lite Codec Pack\Media Player Classic"
echo Starting player
mpc-hc.exe %param% /play /fullscreen
:end
set muz=
set param=
pause
Выделил жирным проблемный участок! В таком виде увеличение строки не происходит, то есть должно быть
Код:
/add "c:\muzic" /add c:\muzic\cool muzic" /add "c:\muzic\1"
Вместо этого привыводе эхом получается
Код:
echo param %param%
param "/add"+"c:\muzic"
Как сложить строки, чтобы накапливалось значение?
|
Petya V4sechkin |
22-02-2012 07:37 1864068 |
sunnykey, примерно так:
Код:
@echo off
setlocal enableextensions enabledelayedexpansion
if "%~1"=="" (
echo Не задана папка для добавления в список воспроизведения.
goto :eof
)
set param=/add "%~1"
for /r "%~1" /d %%f in (*) do set param=!param! /add "%%f"
start /d"%ProgramFiles%\K-Lite Codec Pack\Media Player Classic" mpc-hc.exe !param! /play /fullscreen
|
Три вопроса:
что значит
Код:
setlocal enableextensions enabledelayedexpansion
и
почему переменная обрамлена восклицательными знаками и где это об этом прочитать можно?
|
Petya V4sechkin |
22-02-2012 17:25 1864485 |
sunnykey, в командной строке:
Опцию enableextensions указывать было необязательно (по привычке добавляю), она включена по умолчанию. Главное - это enabledelayedexpansion (так называемое "связывание времени выполнения").
Код:
Связывание времени выполнения для переменных среды окружения полезно при обходе
ограничений раннего связывания, которое происходит при первом чтении текстовой
строки, а не при ее выполнении. Следующий пример демонстрирует возникающую
проблему при использовании раннего связывания переменных:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "%VAR%" == "after" @echo Тело внутреннего оператора сравнения
)
Данное сообщение не будет выводиться, т.к. %VAR% в ОБОИХ выражениях IF
подставляется в момент первого использования в первом IF, в том числе и в тело
первого ветвления IF, которое является составным выражением. В IF внутри
составного выражения в действительности сравниваются значения "before" и
"after", что заведомо ложно. Следующий пример демонстрирует подобную ошибку:
set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%
в данном случае список файлов текущей папки никогда не будет построен. Вместо
этого, значением переменной LIST будет имя последнего найденного файла.
И вновь, это случилось потому, что %LIST% подставляется всего один раз -
в момент обработки выражения FOR, когда список еще пуст.
Фактически, приведенный фрагмент эквивалентен следующему примеру:
for %i in (*) do set LIST= %i
в котором имя последнего найденного файла сохраняется в переменной LIST.
Связывание времени выполнения для переменных среды окружения происходит при
использовании специального символа (восклицательного знака), обозначающего
проведение сопоставления во время выполнения. Если включена поддержка связывания
времени выполнения, то для достижения ожидаемых результатов приведенные выше
фрагменты должны быть изменены следующим образом:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "!VAR!" == "after" @echo Тело внутреннего оператора сравнения
)
set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%
|
Время: 13:42.
© OSzone.net 2001-