Показать полную графическую версию : [решено] Работа команды 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 (http://www.softpedia.com/get/Multimedia/Audio/Tag-Editors/Tag.shtml)
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%
Maza Faka
08-04-2009, 09:52
Так не работает »
Дык и не должно работать, насколько я знаю команда For /F служит для обработки текстовых, а не бинарных файлов. Для просмотра и редактирования mp3-тэгов используйте EasyTag (http://easytag.sourceforge.net/)
Так ведь ни в 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)
допускается ли так:
for %%A in (File) do (команда1 & команда2.... & командаN) »
Допускается, но можно ведь и так:for %%A in (File) do (
команда1
команда2
....
командаN
) Или обязательно нужно в одну строку?
Да, спасибо Gora, конечно так красивее, в одну строчку необходимости нет
И еще вопрос. При разборе файла командой For /f кириллица не понимается (подставляются Дос-символы). Их можно конвертить CMD комадой или набором команд?
При разборе файла командой For /f кириллица не понимается »нормально все понимается - в какой кодировке набран батник, в такой и будет искать подстроку,
перекодировать тоже можно: bat-файл на русском (http://forum.oszone.net/showthread.php?p=927356#post927356)
Devils0411
24-07-2010, 00:36
@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
Не выводит на экран переменную. Скажите, где ошибка?
Не выводит на экран переменную. Скажите, где ошибка? »
set tdir=%ini:~0,-1% »
Потому что не определена переменная ini.
PS
Переменная tdir определяется в цикле и, для ее вывода на экран в цикле, она должна быть не в знаках процента, а в знаках восклицанияEcho !tdir! А в начале файла должна быть строка:SetLocal enabledelayedexpansion
Devils0411
24-07-2010, 11:27
gora, но ведь в переменную tdir записывается переменная ini с уменьшением на один символ с права.
но ведь в переменную tdir записывается переменная ini с уменьшением на один символ с права »
Еще раз повторю:что не определена переменная ini. »
Если переменная в батнике не определена - значит она "пустая" (нет ее). Сколько от нее не отрезай все равно в tdir ни чего не будет добавлено и она тоже будет "пустая" и вывести ее на экран консоли не удастся!
Devils0411
24-07-2010, 12:08
ее нужно определить до цикла или внутри?
Можно до цикла, тогда можно использовать %ini%, а если в цикле, то нужно будет использовать !ini! и строку SetLocal enabledelayedexpansion в начале файла (писал уже выше).
Devils0411
24-07-2010, 12:34
Спасибо за помощь. Решил все-таки в цикле использовать.
Devils0411
24-07-2010, 17:23
Все же проблема осталась...
@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
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.