Работа команды For
Так работает
for /f "usebackq eol=W delims=e" %%A in ("%Temp%\ggg.txt") do @echo %%A
Так не работает
for /f "usebackq eol=W delims=e" %%A in ("%Temp%\Burns.Mp3") do @echo %%A
Как думаю причиной является наличие нулевых байтов в последнем файле. Кто-нибудь знает как это победить? А вообще-то задача проверить mp3-тег в файле.
|
kt626, для MP3 придется использовать сторонние утилиты типа Tag
Код:
For /F "Tokens=1,2 Delims==" %%i In ('2^>^&1TAG --simple "%Temp%\Burns.Mp3"^|Find "="') Do Set %%i=%%j
@Echo Название: %Title%
@Echo Исполнитель: %Artist%
@Echo Альбом: %Album%
@Echo Год: %Year%
|
Дык и не должно работать, насколько я знаю команда For /F служит для обработки текстовых, а не бинарных файлов. Для просмотра и редактирования mp3-тэгов используйте EasyTag
|
Так ведь ни в hh ntcmds.chm, ни в for /? не заявлено, что файлы должны быть только текстовые, вон, например, Find работает по-всякому, а за редакторы тегов спасибо, но задача состоит в том, чтобы из общей папки файлы с уже сгенерированными тегами рассортировать по папкам в зависимости от тега Альбом. Вижу, что Tag 2.0.43 вроде как может это сделать, поищу инфу по его командной строке, но вообще-то в данной теме сторонние проги как-то не cool, попробую еще что-то вроде:
Find "Альбом" "Файл.mp3" > %Temp%\Text.txt
for /f %%A in ("%Temp%\Text.txt") do @echo %%A
|
И еще, кстати по синтаксису (ну не нашел я однозначного ответа в справке) допускается ли так:
for %%A in (File) do (команда1 & команда2.... & командаN)
|
Цитата:
Цитата kt626
допускается ли так:
for %%A in (File) do (команда1 & команда2.... & командаN) »
|
Допускается, но можно ведь и так:
Код:
for %%A in (File) do (
команда1
команда2
....
командаN
)
Или обязательно нужно в одну строку?
|
Да, спасибо Gora, конечно так красивее, в одну строчку необходимости нет
|
И еще вопрос. При разборе файла командой For /f кириллица не понимается (подставляются Дос-символы). Их можно конвертить CMD комадой или набором команд?
|
Цитата:
Цитата kt626
При разборе файла командой For /f кириллица не понимается »
|
нормально все понимается - в какой кодировке набран батник, в такой и будет искать подстроку,
перекодировать тоже можно: bat-файл на русском
|
Devils0411 |
24-07-2010 00:36 1459565 |
Код:
@Echo off
For %%a in ( "%ProgramFiles(x86)%\test4U\run.exe" "%ProgramFiles%\test4U\run.exe" ) Do (
if exist %%a (
set tvalue=%%~dpa
set tdir=%ini:~0,-1%
Echo %tdir%
pause
) Else (
goto end
)
)
:end
Echo ничего нет
pause
Не выводит на экран переменную. Скажите, где ошибка?
|
Цитата:
Цитата Devils0411
Не выводит на экран переменную. Скажите, где ошибка? »
|
Цитата:
Цитата Devils0411
Код:
set tdir=%ini:~0,-1%
»
|
Потому что не определена переменная ini.
PS
Переменная tdir определяется в цикле и, для ее вывода на экран в цикле, она должна быть не в знаках процента, а в знаках восклицания А в начале файла должна быть строка:
Код:
SetLocal enabledelayedexpansion
|
Devils0411 |
24-07-2010 11:27 1459713 |
gora, но ведь в переменную tdir записывается переменная ini с уменьшением на один символ с права.
|
Цитата:
Цитата Devils0411
но ведь в переменную tdir записывается переменная ini с уменьшением на один символ с права »
|
Еще раз повторю:
Цитата:
Цитата gora
что не определена переменная ini. »
|
Если переменная в батнике не определена - значит она "пустая" (нет ее). Сколько от нее не отрезай все равно в tdir ни чего не будет добавлено и она тоже будет "пустая" и вывести ее на экран консоли не удастся!
|
Devils0411 |
24-07-2010 12:08 1459732 |
ее нужно определить до цикла или внутри?
|
Можно до цикла, тогда можно использовать %ini%, а если в цикле, то нужно будет использовать !ini! и строку SetLocal enabledelayedexpansion в начале файла (писал уже выше).
|
Devils0411 |
24-07-2010 12:34 1459746 |
Спасибо за помощь. Решил все-таки в цикле использовать.
|
Devils0411 |
24-07-2010 17:23 1459919 |
Все же проблема осталась...
Код:
@Echo off
SetLocal enabledelayedexpansion
For %%a in ( "%ProgramFiles(x86)%\test4U\run.exe" "%ProgramFiles%\test4U\run.exe" ) Do (
if exist %%a (
set ini=%%~dpa
set tdir=!ini:~0,-1!
Echo !tdir!
pause
) Else (
goto end)
)
:end
Echo ничего нет
pause
Почему то в расчет берется первое множество. Т.е. если в первом множестве не был найден файл, то просто переходит в метке :end, и не проверяет второе множество.
|
Попробуйте так:
Код:
@Echo off
SetLocal enabledelayedexpansion
For %%a in ("%ProgramFiles(x86)%\test4U\run.exe" "%ProgramFiles%\test4U\run.exe") Do (
if exist %%a (
set ini=%%~dpa
set tdir=!ini:~0,-1!
Echo !tdir!
)
)
If Not Defined tdir Echo ничего нет
pause
|
Время: 10:24.
© OSzone.net 2001-