Начальный каталог Windows для командных файлов при запуске от имени администратора - PullRequest
66 голосов
/ 23 марта 2009

У меня есть пакетный файл, который находится в каталоге и должен запускаться оттуда, потому что он обновляет файлы в этом каталоге.
Это прекрасно работает, за исключением случаев, когда пользователь запускает командный файл от имени администратора (требуется в Vista). Тогда начальный каталог - C: \ Windows \ System32.

Есть ли способ узнать, из какого каталога был запущен пакетный файл?
Я не хочу, чтобы пользователь вводил каталог вручную.

Ответы [ 6 ]

93 голосов
/ 23 марта 2009

Попробуйте получить доступ к пути к пакетным файлам следующим образом:

echo %~dp0

Для получения дополнительной информации см. Следующую цитату из команды for /?, которая описывает, как работает вышеуказанная команда:

You can now use the following optional syntax:

    %~I         - expands %I removing any surrounding quotes (")
    %~fI        - expands %I to a fully qualified path name
    %~dI        - expands %I to a drive letter only
    %~pI        - expands %I to a path only
    %~nI        - expands %I to a file name only
    %~xI        - expands %I to a file extension only
    %~sI        - expanded path contains short names only
    %~aI        - expands %I to file attributes of file
    %~tI        - expands %I to date/time of file
    %~zI        - expands %I to size of file
    %~$PATH:I   - searches the directories listed in the PATH
                   environment variable and expands %I to the
                   fully qualified name of the first one found.
                   If the environment variable name is not
                   defined or the file is not found by the
                   search, then this modifier expands to the
                   empty string

The modifiers can be combined to get compound results:

    %~dpI       - expands %I to a drive letter and path only
    %~nxI       - expands %I to a file name and extension only
    %~fsI       - expands %I to a full path name with short names only
    %~dp$PATH:I - searches the directories listed in the PATH
                   environment variable for %I and expands to the
                   drive letter and path of the first one found.
    %~ftzaI     - expands %I to a DIR like output line
40 голосов
/ 08 февраля 2011

Лучше, чем cd - это pushd, что будет

  • изменить букву диска, если начинается с D:\...
  • назначить букву диска, если в сетевом пути UNC

Так что pushd %~dp0 это хорошо.

Хорошей практикой является вызов popd по окончании.

25 голосов
/ 15 мая 2015

Это должно решить вашу проблему, установив рабочий каталог для пакетного файла обратно в текущий каталог:

Включите эти две строки вверху скрипта .bat:

@setlocal enableextensions
@cd /d "%~dp0"

Найдено по адресу: http://www.codeproject.com/Tips/119828/Running-a-bat-file-as-administrator-Correcting-cur

0 голосов
/ 20 ноября 2015

Вы можете записать компакт-диск непосредственно из имени файла, добавив родительский элемент (не тестировался в Windows 8.x, но, насколько я помню, работал "навсегда").

CD %FILENAME%\..

и CD также изменят приводы, используя / D, что показано выше, но явно не упомянуто, поэтому может быть пропущено. CD / D% FILENAME% \ ..

(ЗА /? ЕСЛИ /? ЗАДАВАТЬ /? ВЫЗОВ /? ИДТИ К /? Все они обеспечивают очень полезное чтение, если вы используете cmd.exe, я перечитываю их время от времени.)

0 голосов
/ 25 октября 2010

Рабочее решение здесь:

http://www.vistax64.com/vista-general/79849-run-administrator-changes-default-directory.html

FOR / F %% I IN ("% 0") DO SET BATDIR = %% ~ dpI

ECHO Пакетный файл находится в каталоге% BATDIR%

0 голосов
/ 01 июня 2009

Я использую:

кд% 0 ..

в начале пакетного файла, чтобы изменить каталог на каталог, в котором был запущен пакетный файл.

-Mathew

...