Поведение переменной %CD% отличается, если щелкнуть правой кнопкой мыши и использовать запуск от имени администратора.

У меня есть файл cmd для Windows, который использует переменную среды %CD% для определения каталога выполнения файла cmd.

Когда я запускаю файл cmd из командной строки, он работает правильно, а это означает, что переменная %CD% содержит рабочий каталог. Если я дважды щелкну левой кнопкой мыши cmd, он также сработает, как я ожидаю. Однако, если я щелкну правой кнопкой мыши файл cmd и выберу администратора runas, тогда переменная %CD% будет содержать значение «C:\Windows\system32», а не текущий каталог, в котором выполняется cmd.

Мне удалось воспроизвести проблему с помощью следующего скрипта:

echo %CD%
pause

person Pedro Santos    schedule 13.07.2010    source источник


Ответы (2)


Попытка использовать %~dp0 вместо %cd%... это должно дать вам каталог, содержащий пакетный сценарий (оболочка NT), из которого был запущен в любом случае.

person ewall    schedule 13.07.2010

Вы путаете рабочий/текущий каталог с каталогом, в котором находится ваш пакетный файл?

Если у меня есть простой пакетный файл только с

@echo off
echo %cd%

и это хранится в c:\foo\bar\test.cmd

В cmd я выполняю

cd c:\foo
bar\test

test.cmd напечатает c:\foo, а не c:\foo\bar

Я предполагаю, что UAC использует system32, поскольку можно повысить уровень с другим пользователем, и этот пользователь может не иметь доступа к текущему каталогу.

Если вам нужен каталог, в котором находится ваш пакетный файл, используйте %~dp0, если вам нужен текущий каталог, используйте . или %CD%

person Anders    schedule 13.07.2010
comment
Я полагаю, это не имеет большого отношения к UAC. Рабочий каталог Explorer, вероятно, именно такой. - person Joey; 13.07.2010