Консультация № 185238
21.01.2012, 11:30
0.00 руб.
0 6 1
Уважаемые эксперты! От знакомых слышал много хорошего о вашем портале. Пожалуйста, ответьте на вопрос:
Я начинающий писатель коммандных файлов (bat/cmd). Иной раз казалось бы простую вещь сделать бывает как-то неочевидно. Вот, например, у меня в тексте кода есть строка:
Код:
Set Exe1=D:\Delete\Exe файл1\File Name.exe
В зависимости от потребности и путь и имя файла я меняю. Из переменной Exe1 мне надо выделить только имя файла с расширением. Отдельно описывать в каждой переменной через Set путь к файлу и имя как-то не хочется.Буду благодарен всем откликнувшимся.

Обсуждение

давно
Профессор
230118
3054
21.01.2012, 13:33
общий
21.01.2012, 14:05
Может, Вам поможет ссылка
http://www.dostips.com/DtTipsStringManipulation.php#Snippets.SplitString
То есть разделить переменную, используя разделитель \
Тогда в переменных a,b,c,d будут отдельные части пути.
Также можно с помощью ~ выделить последние символы из строки, но нужно знать их количество. Если все имена файлов из одного количества букв, то пройдет.
Нужно поискать функцию для нахождения последнего вхождения символа.
давно
Мастер-Эксперт
259041
7459
21.01.2012, 16:04
общий
это ответ
Здравствуйте, Посетитель - 391721!
Оператор For-do (как и процедура Call ) позволяет изящно выделять имя, тип, размер, путь, атрибуты и т.д. из строкового значения полного пути к заданному объекту:
For %%f in ("%Exe1%") do Set Exe1nx=%%~nxf
В in-скобках зачитывается содержимое ранее-заданной переменной Exe1, обрамлённой знаками %%.
Кавычки нужны для верной обработки имён с пробелами.
В операторе do литералы ~nx побуждают выбрать ИМЯ и Расширение из параметра %%f , готовое значение присваивается переменной Exe1nx в операторе Set Exe1nx=…

Для демонстрации и экспериментов с преобразованием удобно запустить Cmd-файл со строками:
@Echo off &Echo Executing %0
Set Exe1=D:\Delete\Exe файл1\File Name.exe
Echo Exe1=%Exe1%
For %%f in ("%Exe1%") do Set Exe1nx=%%~nxf
Echo Exe1nx=%Exe1nx%
Echo Press any key to Exit&Pause>nul
Exit


В 1вой строке Ваш исполняемый cmd-файл сообщает, в каком пути он исполняется.
Во 2й Вы задаёте значение переменной Set Exe1=…
В 3й - видите отображение её значения в DOS-кодировке (отличается от исходного для кирилл-букв).
5я строка отображает для Вас искомую выборку.
Последние строки задерживают отображение ответа на экране до любого клав-нажатия.
Разделитель-знак & позволяет разместить несколько операторов в 1 ком-строке программы (актуально для длинных программ).
Описанный сценарий многократно проверен.
См "Справочник по параметрам комстроки" hh ntcmds.chm , Глоссарий: hh glossary.chm
Успехов!
5
Профессионально! Академично! :-)
давно
Модератор
137394
1850
21.01.2012, 21:02
общий
21.01.2012, 21:05
Адресаты:
Спасибо за ответ! Ни на секунду не сомневался, что Вы решите эту проблему. У Вас получилось чуть-чуть проще, чем у меня. Единственное, у меня подобный скрипт не всегда отрабатывал без
SetLocal EnableExtensions
SetLocal EnableDelayedExpansion
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
давно
Мастер-Эксперт
259041
7459
22.01.2012, 03:09
общий
Адресаты:
Захваливаете… Просто совпал мой выход в инет со свежим вопросом по любимой теме.
"у меня подобный скрипт не всегда отрабатывал без SetLocal EnableExtensions" - у меня тоже под Win2000 бывала деф-отключена РОК (Расширенная Обраб-ка Команд) в ПакФайлах, Call-вызванных из др ПФ. Но под WinXpSp3 РОК включен стабильно! Этот режим задают парам-ры EnableExtensions=1 в [{hklm|hkcu}\Software\Microsoft\Command processor] (для данного режима Парам-ры пользов-ля перекрывают парам-ры машины, а Ключи ком-строки типа /e:off перекрывают парам-ры реестра).

EnableDelayedExpansion позв МГНОВЕННОЕ связываение значений переменных, заданных оператором Set=… , разрешая применение !var! , обрамлённых !!-скобками (без него в пределах одной строк-конструкции деф-работает ОТЛОЖЕННОЕ связывание). По моим наблюдениям, DelayedExpansion-состояние НЕ влияет на обработку For- или Call-параметров типа %%f , что даёт нам уникальный шанс раскрывать значения от значений.
С уважением.
давно
Модератор
137394
1850
22.01.2012, 10:35
общий
Адресаты:
Ваш ответ использован здесь.
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
давно
Мастер-Эксперт
259041
7459
22.01.2012, 13:46
общий
Адресаты:
[offtop]Я с интересом читаю рассыл-статьи от Вас, Lamed (задачки с решениями для начинающих программистов), Al_Vi_S ("Чистка компьютера пылесосом" от 3мар2010)… В них описаны полезные решения, о которых мало кто догадается задать вопрос.

У многих из нас случаются долгие задачи, которые нельзя прерывать. Например, провер огромного раздела прогой ChkDsk длится более 3х часов. Если вдруг обстоятельства изменились (надо уезжать), то оч желательно задать прог-усыпление компа по окончани заданного процесса (выключать комп проще, чем усыплять, но тогда пропадёт результ-отчёт, отображаемй т-ко на экране). По приезду можно разбудить комп и увидеть отчёт работы долгой проги (кол-во bad-кластеров).
Когда заранее знаешь, что не дождёшься окончани операции, то мож перенаправить отчёт с экрана в файл. Но если не знаешь, то как включить авто-следилку с прог-усыпителем?
После года попыток мне удалось написать AutoHiber.cmd , кот-й каждые 10минут проверяет выгруз ChkDsk из процессы-перечня (факт окончани проверки). Затем AutoHiber усыпляет WinXp-комп, даже когда спящ-режим отключен. Как Вы думаете, может, это будет кому-то полезно?[/offtop]
Форма ответа