Удаление текущего рабочего каталога из пути - PullRequest
0 голосов
/ 27 апреля 2018

Я работаю в 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 Ответ

0 голосов
/ 01 мая 2018

Я рекомендую сначала прочитать ответы на вопросы переполнения стека:

Большое спасибо 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...