Початковий каталог командного файлу Windows при запуску від імені адміністратора


81

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

Чи можна як-небудь дізнатися, з якого каталогу запущено командний файл?
Я не хочу, щоб користувач входив у каталог вручну.

Відповіді:


114

Спробуйте отримати доступ до шляху до пакетних файлів таким чином:

echo %~dp0

Для отримання додаткової інформації див. Наступну цитату з команди for /? яка описує, як працює вищевказана команда:

Тепер ви можете використовувати наступний необов’язковий синтаксис:

    % ~ I ​​- розгортає% I, видаляючи всі навколишні лапки (")
    % ~ fI - розгортає% I до повноцінного імені шляху
    % ~ dI - розгортає% I лише до букви диска
    % ~ pI - розширює% I лише до контуру
    % ~ nI - розгортає% I лише до імені файлу
    % ~ xI - розширює% I лише до розширення файлу
    % ~ sI - розширений шлях містить лише короткі імена
    % ~ aI - розширює% I до атрибутів файлу
    % ~ tI - розширює% I до дати / часу файлу
    % ~ zI - розширює% I до розміру файлу
    % ~ $ PATH: I - здійснює пошук у каталогах, перелічених у PATH
                   середовища і розширює% I до
                   повне ім'я першого знайденого.
                   Якщо ім'я змінної середовища не є
                   або файл не знайдений
                   пошук, тоді цей модифікатор розширюється до
                   порожній рядок

Модифікатори можна комбінувати, щоб отримати складні результати:

    % ~ dpI - розширює% I лише до літери диска та шляху
    % ~ nxI - розширює% I лише до імені та розширення файлу
    % ~ fsI - розгортає% I до повного імені шляху лише із короткими іменами
    % ~ dp $ PATH: I - здійснює пошук у каталогах, перелічених у PATH
                   змінна середовища для% I і розширюється до
                   букву диска та шлях першого знайденого.
    % ~ ftzaI - розширює% I до вихідного рядка типу DIR

Фантастично, я цього не знав. Велике спасибі
Марк

Як неясно! Але саме те, що мені потрібно було. Дякую.
stucampbell

1
@stucampbell спробуйте команду 'for /?' щоб отримати детальний опис того, як це працює (прокрутіть до сторінки 4)
Мартін

Donny V спробуйте pushdнижче
nwgat

@Donny V працює в Windows 8.1 - я спробував. Майте на увазі, що це буде працювати лише в тому випадку, якщо ви запускаєте його в пакетному файлі.
Мартін,

51

Краще, ніж cdце pushdбуде

  • змінити букву диска, якщо починається з D:\...
  • присвоїти букву диска, якщо на мережі UNC

Так pushd %~dp0добре.

Тоді гарною практикою є дзвінок popdпісля закінчення.


Чудове рішення для систем з декількома томами та працює в Windows 7, 8, 8.1 та 10, +1
Bit Fracture

30

Це має вирішити вашу проблему, встановивши робочий каталог для командного файлу назад до поточного каталогу:

Включіть ці два рядки у верхній частині сценарію .bat:

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

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


1
Це ідеально. Вирішено мою проблему "файл не знайдено" під час запуску файлу bat від імені адміністратора.
PNDA

1

Я використовую:

кд% 0 ..

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

-Метевій


1
Це не змінить букву диска.
Хорхе Фуентес Гонсалес,

Це насправді найкраще рішення, просто змініть його на cd %0/../👍
St3ve R0nix

1

Щоб вирішити цю проблему, додайте два рядки у верхній частині сценарію .bat:

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

0

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

CD %FILENAME%\..

і CD також змінить накопичувачі, використовуючи / D, що показано вище, але явно не згадується, тому його можна пропустити. CD / D% FILENAME% \ ..

(FOR /? IF /? SET /? CALL /? GOTO /? Всі забезпечують дуже корисне читання, якщо ви використовуєте cmd.exe, я їх перечитую раз у раз.)


0

@setlocal enableextensions

@cd / d "% ~ dp0"


3
Сайед Абдул Хасіб, я сумніваюся, що це допомагає або взагалі працює. Щоб переконати мене в протилежному, додайте пояснення того, як це працює і чому це допомагає. Це допомогло б боротися з помилковим розумінням того, що StackOverflow забезпечує безкоштовне програмування.
Юннош

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.