1.
2. «Если первый параметр командного файла имеет расширение, то …». Подробности:
Цитата:
Цитата элькхар
что значит equ ? просмотрел справку по ифу не нашел »
|
Стало быть, у Вас Windows XP. Там в справке по «if /?» есть ошибка — написано «eql» вместо «equ». Означает — «equal», «равно». Можете почитать в chm-справке:
Код:
hh.exe mk:@MSITStore:C:\WINDOWS\Help\ntcmds.chm::/if.htm
3. «Вызвать новый контекст командного файла по метке «:CheckExtension», передав ему в качестве параметров переменные окружения «sCommand» и «pathext».
4.
Добавить к найденному пути («%%~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» параметры с:
не примут вид:
Тогда на очередном шаге исполнения, после команды:
переменная окружения «sExtension» будет удалена (поскольку в этот момент второго параметра уже нет, не существует, остался только первый параметр «"notepad"»). Следовательно, условие в следующей команде «if defined sExtension …» окажется ложным и произойдёт выход из процедуры и возврат в контекст основного пакетного файла.
В принципе, можно предусмотреть условие, которое сразу будет прерывать последующий перебор расширений, как только будет найдено первое же совпадение.