#batch-file #cmd
#пакетный файл #cmd
Вопрос:
Я не могу понять, почему командная строка внезапно забывает определенные команды после первого использования. Я создал папку на своем компьютере для хранения своих пользовательских команд, чтобы упростить себе жизнь. Я добавил эту папку в свою переменную среды PATH, чтобы я мог быстро получить доступ к своим командам.
Например: запуск ipconfig дважды или более раз приводит к тому, что команда каждый раз работает должным образом. Выполнение команды псевдонима (код приведен ниже) дважды или более работает, как и ожидалось. Повторное выполнение моей команды deletefolder работает только в первый раз. Во второй раз он говорит, что «deletefolder» не распознается как внутренняя или внешняя команда, работоспособная программа или пакетный файл. Теперь команда alias тоже больше не работает (не распознается), но ipconfig все еще работает. Чтобы мои команды снова заработали, я должен перезапустить командную строку.
Я попытался найти причину этого, но не нашел никакого ответа на это поведение. Такое ощущение, что это что-то простое, но я действительно не могу понять, что. Я старался быть настолько тщательным, насколько мог, пожалуйста, дайте мне знать, если я должен что-нибудь уточнить.
удалить пакетный файл папки:
@echo off
set path=%1
IF DEFINED path (
GOTO run
) ELSE (
GOTO help
)
:help
echo. Usage:
echo. deletefolder [path]
exit /B
:run
CHOICE /C YN /M "Are you sure?"
IF ERRORLEVEL 1 (
:del /f/s/q %path% > nul
:rmdir /s/q %path%
)
exit /B
команда псевдонима (автор: Бенджамин Эйдельман, beneidel@gmail.com )
@echo off
set operation=%1
set aliasname=%2
set aliasfile=%~dp0%2.cmd
IF "%~1"=="" GOTO help
IF /I "%~1"=="list" GOTO listaliases
IF /I "%~1"=="set" GOTO setalias
IF /I "%~1"=="get" GOTO getalias
IF /I "%~1"=="delete" GOTO deletealias
IF /I "%~1"=="here" GOTO setaliashere
:help
echo. Usage:
echo. alias list - list available cmd aliases
echo. alias set [name] [command line] - set an alias
echo. alias get [name] - show an alias
echo. alias delete [name] - delete alias
echo. alias here [name] [command line] - create alias cmd on cwd
exit /B
:listaliases
dir /B %~dp0*.cmd
exit /B
:setaliashere
set aliasfile=%2.cmd
:setalias
if "%aliasname%"=="alias" (
echo ERROR: cannot set this alias
exit /B 1
)
echo %1 %2> "%aliasfile%"
for %%a in ("%aliasfile%") do set /a length=%%~za
set /a length=length-1
set commandline=%*
setlocal enableDelayedExpansion
call set commandline=!commandline:~%length%!
set commandline=%commandline% %%*
echo %commandline%> "%aliasfile%"
echo INFO: alias "%aliasname%" set
exit /B
:getalias
if exist %aliasfile% (
type %aliasfile%
) ELSE (
echo ERROR: alias not found
exit /B 1
)
exit /B
:deletealias
if /I "%aliasname%"=="alias" (
echo ERROR: cannot delete this alias
exit /B 1
)
if exist %aliasfile% (
del %aliasfile%
echo INFO: alias deleted
) ELSE (
echo INFO: alias not found
)
exit /B
Комментарии:
1. Просто введите
doskey /?
.
Ответ №1:
В PATH
переменная среды имеет очень особое (и решающее) значение:
Переменная
%PATH%
среды содержит список папок. Когда в командной строке выдаетсяCMD
команда, операционная система сначала ищет исполняемый файл в текущей папке, если он не найден, он будет сканировать%PATH%
, чтобы найти его.
Не меняйте PATH
переменную произвольно, используйте другое имя переменной, например _path
, следующим образом:
set "_path=%1"
IF DEFINED _path (
GOTO run
) ELSE (
GOTO help
)
rem your script continues here
Комментарии:
1. О, моя ошибка в том, что я случайно переопределяю переменную Path?
2. Я переименовал свою переменную path в path, и теперь все работает так, как задумано. Очень хороший улов! Большое спасибо за помощь!