CMD/BAT - [решено] Сложение двух строк в bat - файле

Ответить
Аватара пользователя
sunnykey

CMD/BAT - [решено] Сложение двух строк в bat - файле

Сообщение sunnykey »

Здравствуйте, стоит такая задача: проигрывателю 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

Re: CMD/BAT - [решено] Сложение двух строк в bat - файле

Сообщение Petya V4sechkin »

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
Аватара пользователя
sunnykey

Re: CMD/BAT - [решено] Сложение двух строк в bat - файле

Сообщение sunnykey »

Три вопроса:

что значит



Код:

Код: Выделить всё

setlocal enableextensions enabledelayedexpansion

и

почему переменная обрамлена восклицательными знаками и где это об этом прочитать можно?
Аватара пользователя
Petya V4sechkin

Re: CMD/BAT - [решено] Сложение двух строк в bat - файле

Сообщение Petya V4sechkin »

sunnykey, в командной строке:



Код:

Код: Выделить всё

setlocal /?

Опцию 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%
Ответить

Вернуться в «Скриптовые языки администрирования Windows»