Тема: CMD/BAT: Получить расширение файла из переменной
С наступающим всех.
Голова под конец года не хочет работать. Проблема такая.
code.cmd
@echo %~x0
Выводит расширение с точкой:
.cmd
Как получить без точки?
Заранее благодарю.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
С наступающим всех.
Голова под конец года не хочет работать. Проблема такая.
code.cmd
@echo %~x0
Выводит расширение с точкой:
.cmd
Как получить без точки?
Заранее благодарю.
set ext=%~x0
echo %ext:*.=%
echo %ext:~1%
Благодарю.
Еще вопросец в продолжении темы. Совсем не догоняю почему так.
Есть папка в которой лежит 2 файла.
set.txt
script.cmd
@for /f "tokens=*" %%a in ('dir *.* /b') do @(
set ext=%%~xa
echo %ext:~1%
)
Во лог команд консоли:
c:\tmp>script.cmd
~1
~1
c:\tmp>script.cmd
txt
txt
c:\tmp>ren set.txt set.log
c:\tmp>script.cmd
txt
txt
c:\tmp>script.cmd
log
log
Вопросы. возникли.
Почему при первом запуске получается ~1?
Почему выводится расширение только txt файла?
Почему после переименования, батник только со 2 раза начинает догадываться, что-то тут не так?
Кажется мне почему то что я глупости пишу тут. Но прошу, если не охота объяснять, хотя бы ткните в правильную страницу мануала.
Прочел внимательней set /?, ошибку свою понял. Но пока не понимаю как правильно написать код.
Сообразил код.
@for /f "tokens=*" %%a in ('dir *.* /b') do @(
set ext=%%~xa
echo !ext:~1!
Но работает только если запустить cmd.exe /v
Если же просто запустить батник, то код не отрабатывает. Тоска печаль.
Ура все получилось.
@setlocal enabledelayedexpansion
@for /f "tokens=*" %%a in ('dir *.* /b') do @(
set ext=%%~xa
echo !ext:~1!
)
Спасибо всем, кто принял участие в теме.
А вот еще один баг. Создайте файл без расширения. Запустите скрипт. Посмотрите результат.
Лечится так:
if defined ext echo !ext:~1!
Это не проблема расширения. Это проблема интерпретатора командной строки - раскрытие значения несуществующей переменной.
Спс за дополнение.
Суть батника была такая (с учетом ваших дополнений):
@setlocal enabledelayedexpansion
@for /f "tokens=*" %%a in ('dir *.* /b') do @(
set ext=%%~xa
set str=
if defined ext set str= [!ext:~1!]
"c:\Program Files\7-Zip\7z.exe" a -r -t7z "%%~na!str!.7z" "%%a"
)
Жать все файлы и папки в текущей директории, добавляя расширение в имя архива.
То есть Вам надо получить не просто filename.ext.7z, а именно filename[ext].7z. Полагаю, что в строке
str= [!ext:~1!]
опечатка и пробела после знака равенства быть не должно. Или Вам нужен именно такой результат filename [ext].7z? В таком случае существует небольшая вероятность получить файл с ведущим пробелом в начале имени файла, если исходный файл будет без имени, например .ext.
Да да, пробел нужен. Мне так удобней. А пустых имен нету, потому как, в ручном режиме все проверяю.
Книжки электронные решил, к одному виду привести. А то все как попало, разными архиваторами упакованные, названия, авторы, рус/анл...
Так что в таком виде код вполне устраивает. Отрабатывает без глюков. Спс.
То есть Привожу к виду:
Учение дона Хуана.txt
Путешествие в Икстлан.rtf
Переконвертить в
Учение дона Хуана [txt].7z
Путешествие в Икстлан [rtf].7z
и тд...
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться