Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Программа, показывающая, какой файл выполнится, если набрать ком. переданную в парам.

Ответить
Настройки темы
CMD/BAT - [решено] Программа, показывающая, какой файл выполнится, если набрать ком. переданную в парам.

Новый участник


Сообщения: 8
Благодарности: 0


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: элькхар
Дата: 24-10-2012
Описание: Изменение названия темы
Написать программу, показывающую, какой файл выполнится, если набрать команду, переданную в параметрах.

Должны поддерживаться как команды с расширением, так и без (т.е. calc и calc.exe)

Пример запуска:
>which.cmd calc
C:\Windows\system32\calc.exe

//Желательно без использования сложных регулярных выражений.

Отправлено: 21:08, 24-10-2012

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

set sCommand=%~1

if defined sCommand (
	if "%~x1" equ "" (
		call :CheckExtension "%sCommand%" %pathext%
	) else (
		for %%i in ("%sCommand%") do if exist "%%~$PATH:i" echo "%%~$PATH:i"
	)
) else (
	echo Usage: %~nx0 ^<command^>
	exit /b 1
)

endlocal
exit /b 0

:CheckExtension
	setlocal enableextensions enabledelayedexpansion
	
:Repeat
	set sExtension=%~2
	
	if defined sExtension (
		for %%i in ("%~1%sExtension%") do if exist "%%~$PATH:i" echo "%%~$PATH:i"
		shift /2
		goto :Repeat
	)
	
	endlocal
	exit /b 0

Последний раз редактировалось Iska, 25-10-2012 в 02:20. Причина: Упростил код: «%%~dp$PATH:i%%~i» → «%%~$PATH:i»

Это сообщение посчитали полезным следующие участники:

Отправлено: 21:36, 24-10-2012 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


Огромное спасибо не расскажите как это работает?
1)
Код: Выделить весь код
enableextensions
что делает этот параметр?
2)
Код: Выделить весь код
if "%~x1" equ ""
что значит equ ? просмотрел справку по ифу не нашел
3)
Код: Выделить весь код
call :CheckExtension "%sCommand%" %pathext%
зачем нужна данная строка? и что значит
Код: Выделить весь код
"%sCommand%" %pathext%
4)
Код: Выделить весь код
"%%~dp$PATH:i%%~i"
зачем тут %%~i
5)
Код: Выделить весь код
echo Usage: %~nx0 ^<command^>
Usage?? и %~nx0 ^<command^>
6)
Код: Выделить весь код
set sExtension=%~2
~2 означает что берется все начиная с третьего символа, или я путаю?
7)
Код: Выделить весь код
if defined sExtension
если она не пустая?

8)и по всему репиту немогу точно понять что он делает ~1,~2 и ~i ставят меня в тупик

Отправлено: 23:19, 24-10-2012 | #3


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


1.
Код: Выделить весь код
setlocal /?
2. «Если первый параметр командного файла имеет расширение, то …». Подробности:
Код: Выделить весь код
call /?
Цитата элькхар:
что значит equ ? просмотрел справку по ифу не нашел »
Стало быть, у Вас Windows XP. Там в справке по «if /?» есть ошибка — написано «eql» вместо «equ». Означает — «equal», «равно». Можете почитать в chm-справке:
Код: Выделить весь код
hh.exe mk:@MSITStore:C:\WINDOWS\Help\ntcmds.chm::/if.htm
3. «Вызвать новый контекст командного файла по метке «:CheckExtension», передав ему в качестве параметров переменные окружения «sCommand» и «pathext».

4.
Цитата элькхар:
зачем тут %%~i »
Добавить к найденному пути («%%~dp$PATH:i%») имя самого файла.

Я тут просто «перебдел» c «dp». Можно упростить: «%%~dp$PATH:i%%~i» → «%%~$PATH:i». Я поправил код выше.

5. Можно так:
Код: Выделить весь код
echo Использование: %~nx0 ^<команда^>
Это просто подсказка, вызываемая в случае, если командный файл был вызван без параметра.

6. Путаете. «Присвоить переменной окружения «sExtension» значение второго переданного на метку параметра».

7 и 8.
Цитата элькхар:
если она не пустая? »
«Если переменная окружения «sExtension» существует».

Смотрите:
читать дальше »
мы вызываем процедуру (это, конечно, никакая не процедура, но так проще для разговора) «:CheckExtension» и передаём ей несколько параметров:
Код: Выделить весь код
call :CheckExtension "%sCommand%" %pathext%
Что в неё приходит? Например, мы вызвали пакетный файл с параметром «notepad». Значит, в процедуру приходит первый параметр — имя файла «notepad» и содержимое переменной окружения «%pathext%», обычно это:
Код: Выделить весь код
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;
Следовательно, вторым параметром будет передан «.COM», третьим —«.EXE» и т.д. (дело в том, что точка с запятой — «;» — рассматривается командным процессором как разделитель, такой же как и пробел).


Рассмотрим ход исполнения:
Код: Выделить весь код
…
:Repeat
	set sExtension=%~2
	
	if defined sExtension (
		for %%i in ("%~1%sExtension%") do if exist "%%~$PATH:i" echo "%%~$PATH:i"
		shift /2
		goto :Repeat
	)
…
по шагам.

На первом шаге
читать дальше »
переменная окружения «sExtension» принимает значение «.COM». Далее успешно проверяется, существует ли она. Затем, выполняется:
Код: Выделить весь код
		for %%i in ("%~1%sExtension%") do if exist "%%~$PATH:i" echo "%%~$PATH:i"
или, если подставить значения:
Код: Выделить весь код
		for %%i in ("notepad.COM") do if exist "%%~$PATH:i" echo "%%~$PATH:i"
что означает: проверить существование «notepad.COM» в путях, перечисленных в переменной окружения PATH и, если такой файл существует — вывести полный путь к нему. Поскольку файла «notepad.COM» в путях не будет найдено, ничего не будет выведено. Следующей командой — «shift /2» параметры процедуры:
Код: Выделить весь код
"notepad" .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;
будут «сдвинуты» таким образом:
Код: Выделить весь код
"notepad" .EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;
Затем произойдёт переход к метке «:Repeat».


На втором шаге
читать дальше »
переменная окружения «sExtension» принимает значение «.EXE». Далее снова успешно проверяется, существует ли она. Затем, снова выполняется:
Код: Выделить весь код
		for %%i in ("%~1%sExtension%") do if exist "%%~$PATH:i" echo "%%~$PATH:i"
или, если подставить значения:
Код: Выделить весь код
		for %%i in ("notepad.EXE") do if exist "%%~$PATH:i" echo "%%~$PATH:i"
— проверить существование «notepad.EXE» в путях, перечисленных в переменной окружения PATH и, если такой файл существует — вывести полный путь к нему. Поскольку файл «notepad.EXE» будет найден в пути «C:\WINDOWS\system32\», будет выведено: «"C:\WINDOWS\system32\notepad.exe"». Затем снова командой — «shift /2» уже текущие параметры процедуры:
Код: Выделить весь код
"notepad" .EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;
будут «сдвинуты» ещё «левее»:
Код: Выделить весь код
"notepad" .BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;
Затем снова произойдёт переход к метке «:Repeat».


И так до тех пор, пока
читать дальше »
у нас после очередного исполнения «shift /2» параметры с:
Код: Выделить весь код
"notepad" .WSH;
не примут вид:
Код: Выделить весь код
"notepad"
Тогда на очередном шаге исполнения, после команды:
Код: Выделить весь код
set sExtension=%~2
переменная окружения «sExtension» будет удалена (поскольку в этот момент второго параметра уже нет, не существует, остался только первый параметр «"notepad"»). Следовательно, условие в следующей команде «if defined sExtension …» окажется ложным и произойдёт выход из процедуры и возврат в контекст основного пакетного файла.


В принципе, можно предусмотреть условие, которое сразу будет прерывать последующий перебор расширений, как только будет найдено первое же совпадение.
Это сообщение посчитали полезным следующие участники:

Отправлено: 02:41, 25-10-2012 | #4



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Программа, показывающая, какой файл выполнится, если набрать ком. переданную в парам.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
DNS/DHCP - Какой адрес должен вернуть DNS если есть 2 записи А Tonny_Bennet Сетевые технологии 2 04-05-2012 16:03
CMD/BAT - [решено] Включить программу если включена то выключить Tiar Скриптовые языки администрирования Windows 2 01-02-2012 01:10
Если на диске есть ОС, то при установке спрашивает, какой раздел использовать tirex555 Автоматическая установка Windows 11 / 10 / 8 / 7 / Vista 1 31-01-2008 16:20
Как удалить программу если система не отвечает на запросы laguna777 Microsoft Windows 2000/XP 3 13-02-2007 02:04
Как изменить надпись, показывающую версию винды на десктопе? npomoH Хочу все знать 5 07-07-2006 23:01




 
Переход