пакетный файл: назначить десятичное значение переменной - PullRequest
2 голосов
/ 20 февраля 2011

Этот скрипт запускается из каталога файлов OGG.

cd c:\dirWithOGG
for %%f in (*.ogg) do (
sox %%f %%f pad 0 "soxi -D %%f"
sox %%f %%f repeat 10
)

Когда мне впервые пришлось создать пакетный скрипт, я подумал, что это будет легко.

soxi -D %%f

Само по себе вышеприведенное возвращает десятичное значение. По какой-то причине он не выполняется изнутри скрипта. sox и soxi находятся в местоположении, добавленном к PATH .

Любая помощь приветствуется, спасибо.

Ответы [ 3 ]

1 голос
/ 20 февраля 2011

Если вы хотите использовать вывод soxi -D %%f в качестве параметра командной строки для sox, вот как вы можете это сделать:

FOR %%f IN (*.ogg) DO CALL :runsox "%%f"
GOTO :EOF

:runsox
soxi -D %1>tmpfile
SET /P decvalue=<tmpfile
sox %1 %1 pad 0 %decvalue%
sox %1 %1 repeat 10

Как видите, команды внутри цикла были перенесены в подпрограмму, которую цикл вызывает сейчас. Кроме этого, вывод soxi перенаправляется в файл, который затем считывается в переменную, которая, в свою очередь, используется для передачи значения в sox.

Это на самом деле из-за переменной, которую мне пришлось перенести команды за пределы цикла. Он будет работать некорректно внутри цикла, если не включено отложенное расширение и не используется другой синтаксис для обращения к переменной. Я предпочел, чтобы это было реализовано, как указано выше.

0 голосов
/ 20 февраля 2011

Попробуйте увеличить FOR в вашей голове (или на бумаге):

FOR %%F IN (*.ogg) DO (
  sox %%F %%F pad 0 "soxi -D %%F"
  sox %%F %%F repeat 10
)

Если у вас есть один .ogg файл, скажем foo.ogg, то цикл FOR приведет к выполнению следующих двух операторов.

sox foo.ogg foo.ogg pad 0 "soxi -D foo.ogg"
sox foo.ogg foo.ogg repeat 10

Я не думаю, что первая строка будет делать то, что вы ожидаете. Он запустит sox и передаст остаток строки в качестве параметров. Он не будет выполнять soxi -D foo.ogg и заменяет его своим выводом. DOS не работает таким образом вообще. Попробуйте что-то вроде:

SETLOCAL EnableExtensions
FOR %%F IN (*.ogg) DO (
  FOR /F %%N IN ('soxi -D %%F') DO (
    sox %%F %%F pad 0 "%%N"
    sox %%F %%F repeat 10
  )
)
ENDLOCAL

Это может сработать. У меня нет доступа к блоку DOS, поэтому у меня может быть неправильный внутренний синтаксис FOR. Возможно, вам придется указать подкоманду с помощью обратных кавычек или двойных кавычек. Расширенная версия цикла FOR требует, чтобы расширения команд были включены IIRC. Попробуйте ввести FOR /? в командной строке или прочитайте http://www.computerhope.com/forhlp.htm для получения дополнительной информации.

0 голосов
/ 20 февраля 2011

Если я правильно помню, for требует, чтобы действие было указано в той же строке.Попробуйте следующее:

for %%f in (*.ogg) do sox %%f %%f pad 0 "soxi -D %%f" && sox %%f %%f repeat 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...