Командная строка «забывает» команду после первого использования

#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, и теперь все работает так, как задумано. Очень хороший улов! Большое спасибо за помощь!