Удаление текущего рабочего каталога из пути
Я работаю в Windows и хотел бы знать, есть ли способ удалить текущий рабочий каталог из пути? Я понимаю, что это поведение по умолчанию в PowerShell, но мне нужно, чтобы оно работало в пакетном режиме или в командной строке Windows.
В UNIX я бы просто убедился, что мой $PATH
переменная не содержит .
, Есть ли способ сделать это в партии? Это текущее поведение:
H:\tmp>dir
Volume in drive H has no label.
Volume Serial Number is E29C-7B61
Directory of H:\tmp
04/27/2018 10:39 AM <DIR> .
04/27/2018 10:39 AM <DIR> ..
04/27/2018 10:40 AM 37 dwk.bat
1 File(s) 37 bytes
2 Dir(s) 987,995,770,880 bytes free
H:\tmp>dwk.bat
dwk.bat has been run.
H:\tmp>
Это желаемое поведение:
H:\tmp>dwk.bat
'dwk.bat' is not recognized as an internal or external command,
operable program or batch file.
H:\tmp>.\dwk.bat
dwk.bat has been run.
H:\tmp>
Благодарю.
1 ответ
Я рекомендую сначала прочитать ответы на вопросы о переполнении стека:
- Где "СТАРТ" ищет исполняемые файлы?
- Почему "..." не распознается как внутренняя или внешняя команда, работающая программа или командный файл?
Большое спасибо eryksun из-за этого ответа не существовало бы без его комментария к вышеуказанному ответу.
Далее я рекомендую прочитать статьи Microsoft Developer Network (MSDN):
На вопрос можно ответить: Да, это возможно для настольных приложений и пакетных файлов на
- Windows Vista и все более поздние версии клиента Windows и
- Windows Server 2003 и все более поздние версии Windows Server.
Переменная среды с именем NoDefaultCurrentDirectoryInExePath
должно быть определено с любым значением, чтобы предотвратить выполнение скрипта (.bat, .cmd, .vbs, ...) или приложения (.com, .exe), хранящегося в текущем каталоге, без явного использования .\
как требуется в Unix/Linux.
Переменная среды NoDefaultCurrentDirectoryInExePath
Можно определить как системную переменную, чтобы отключить поиск в текущем каталоге сценария или приложения для всех учетных записей на этом компьютере. Но это, безусловно, плохая идея, так как это определенно приведет к тому, что многие приложения, включая установщики и деинсталляторы, больше не будут работать правильно.
Переменная среды NoDefaultCurrentDirectoryInExePath
может быть определена как переменная пользователя, чтобы отключить поиск в текущем каталоге сценария или приложения для процессов, использующих эту учетную запись. Но это, безусловно, тоже не очень хорошая идея.
Но может иметь смысл установить переменную среды NoDefaultCurrentDirectoryInExePath
как локальная переменная в некоторых случаях, чтобы отключить поиск в текущем каталоге для скрипта или приложения без явного использования .\
в версиях Windows с функцией ядра NeedCurrentDirectoryForExePath
который cmd.exe
вызовы перед поиском файла сценария или приложения, не содержащего обратной косой черты \
(или косая черта /
) в строке имени файла.
Пример:
@echo off
pushd "%TEMP%"
set "NoDefaultCurrentDirectoryInExePath=0"
echo @echo %%0 executed successfully.>Test1.bat
echo Calling Test1.bat ...
call Test1.bat
echo Calling .\Test1.bat ...
call .\Test1.bat
echo Starting Test1.bat ...
start /wait Test1.bat ^& timeout 5
set "NoDefaultCurrentDirectoryInExePath="
echo Calling again Test1.bat ...
call Test1.bat
del Test1.bat
popd
pause
Этот пакетный файл, выполненный из окна командной строки, приводит к выводу текущего окна консоли:
Calling Test1.bat ...
'Test1.bat' is not recognized as an internal or external command,
operable program or batch file.
Calling .\Test1.bat ...
.\Test1.bat executed successfully.
Starting Test1.bat ...
Calling again Test1.bat ...
Test1.bat executed successfully.
Press any key to continue . . .
И во время выполнения этого командного файла открывается второе консольное окно с выводом:
"%TEMP%\Test1.bat" executed successfully.
Это второе окно консоли закрывается автоматически через 5 секунд.
Переменная среды NoDefaultCurrentDirectoryInExePath
определяется со значением 0
после установки каталога для временных файлов в качестве текущего каталога с проталкиванием текущего пути каталога в стек. Значение переменной не имеет значения, поскольку оценивается только наличие переменной среды, а не ее значение.
Следующий очередной пакетный файл с именем Test1.bat
создается в каталоге для временных файлов, который обычно не защищен от записи для текущего пользователя, поскольку это может вызвать много проблем.
Первый подход к вызову Test1.bat
без какого-либо пути не удается из-за переменной среды NoDefaultCurrentDirectoryInExePath
определяется в местной среде.
Второй звонок Test1.bat
с относительным путем .\
успешно, несмотря на наличие переменной окружения.
Команда START игнорирует NoDefaultCurrentDirectoryInExePath
как доказано в этом пакетном файле.
Тогда переменная окружения NoDefaultCurrentDirectoryInExePath
удаляется, чтобы восстановить исходное поведение Windows.
Второй подход к вызову Test1.bat
без какого-либо пути сейчас успешен.
Наконец то созданный Test1.bat
удаляется, и первоначальный текущий каталог восстанавливается как текущий каталог.
Конечно, невозможно предотвратить выполнение команды DIR, которая не является файлом сценария или исполняемым файлом. Это внутренняя команда cmd.exe
- Командный процессор Windows - соответственно powershell.exe
- Windows PowerShell.