Консультация онлайн # 185238

Раздел: JavaScript / VBScript
Автор вопроса: Посетитель - 391721
Дата: 21.01.2012, 11:30 Консультация неактивна
Поступило ответов: 1
Уважаемые эксперты! От знакомых слышал много хорошего о вашем портале. Пожалуйста, ответьте на вопрос:
Я начинающий писатель коммандных файлов (bat/cmd). Иной раз казалось бы простую вещь сделать бывает как-то неочевидно. Вот, например, у меня в тексте кода есть строка:
Код
Set Exe1=D:\Delete\Exe файл1\File Name.exe
В зависимости от потребности и путь и имя файла я меняю. Из переменной Exe1 мне надо выделить только имя файла с расширением. Отдельно описывать в каждой переменной через Set путь к файлу и имя как-то не хочется.Буду благодарен всем откликнувшимся.
Здравствуйте, Посетитель - 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
Успехов!

Алексеев Владимир Николаевич

Мастер-Эксперт
21.01.2012, 16:04
5
Профессионально! Академично! :-)

Мини-форум консультации # 185238

Асмик Гаряка

Советник

ID: 230118

268733

= общий =    21.01.2012, 13:33
Может, Вам поможет ссылка
http://www.dostips.com/DtTipsStringManipulation.php#Snippets.SplitString
То есть разделить переменную, используя разделитель \
Тогда в переменных a,b,c,d будут отдельные части пути.
Также можно с помощью ~ выделить последние символы из строки, но нужно знать их количество. Если все имена файлов из одного количества букв, то пройдет.
Нужно поискать функцию для нахождения последнего вхождения символа.
Последнее редактирование 21.01.2012, 14:05 Асмик Гаряка (Советник)
Megaloman

Мастер-Эксперт

ID: 137394

268753

= общий =    21.01.2012, 21:02
Спасибо за ответ! Ни на секунду не сомневался, что Вы решите эту проблему. У Вас получилось чуть-чуть проще, чем у меня. Единственное, у меня подобный скрипт не всегда отрабатывал без
SetLocal EnableExtensions
SetLocal EnableDelayedExpansion
Последнее редактирование 21.01.2012, 21:05 Megaloman (Мастер-Эксперт)
=====
Нет времени на медленные танцы
Алексеев Владимир Николаевич

Мастер-Эксперт

ID: 259041

268771

= общий =    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 , что даёт нам уникальный шанс раскрывать значения от значений.
С уважением.
Megaloman

Мастер-Эксперт

ID: 137394

268775

= общий =    22.01.2012, 10:35
Ваш ответ использован здесь.
=====
Нет времени на медленные танцы
Алексеев Владимир Николаевич

Мастер-Эксперт

ID: 259041

268793

= общий =    22.01.2012, 13:46
Offtopic: Я с интересом читаю рассыл-статьи от Вас, Lamed (задачки с решениями для начинающих программистов), Al_Vi_S ("Чистка компьютера пылесосом" от 3мар2010)… В них описаны полезные решения, о которых мало кто догадается задать вопрос.

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