2009-03-23 29 views
58

Mam plik wsadowy, który znajduje się w katalogu i musi być uruchamiany stamtąd, ponieważ aktualizuje pliki w tym katalogu.
Działa to doskonale, z wyjątkiem sytuacji, gdy użytkownik uruchamia plik wsadowy jako administrator (wymagany w systemie Vista). Następnie katalog początkowy to C: \ Windows \ System32.

Czy istnieje sposób, aby nadal wiedzieć, z którego katalogu został uruchomiony plik wsadowy?
Nie chcę, aby użytkownik ręcznie wchodził do katalogu.Katalog początkowy plików wsadowych systemu Windows po uruchomieniu "admin as

Odpowiedz

77

Spróbuj uzyskać dostęp do ścieżki pliki wsadowe takiego:

echo %~dp0 

Aby uzyskać więcej informacji, zobacz następujący cytat z poleceniem for /? który opisuje w jaki sposób powyższe polecenie działa:

 
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 
+0

Fantastic , Nie znałem tego. Wielkie dzięki – Marc

+0

Jak niezrozumiałe! Ale dokładnie to, czego potrzebowałem. Dzięki. – stucampbell

+1

@stucampbell wypróbuj polecenie "dla /?" aby uzyskać szczegółowy opis tego działania (przewiń w dół do strony 4) – Martin

0

używać:

cd% 0 ..

na początku Inning pliku wsadowego do zmiany katalogu do katalogu, w którym plik wsadowy został uruchomiony

-Mathew

+0

To nie zmieni litery dysku. –

30

Lepsze niż cd jest pushd które

  • zmiana litera dysku, jeśli począwszy od D:\...
  • przypisać literę dysku, czy na ścieżce sieciowej UNC

Więc pushd %~dp0 jest dobra.

Dobra praktyka to połączenie popd po zakończeniu.

+1

+1 za wymienienie nieznanego polecenia 'pushd'. – Martin

+0

działa to w Windows 8.1 – wiak

+0

Świetne rozwiązanie dla systemów z wieloma woluminami i działa w Windows 7, 8, 8.1 i 10, +1 –

18

To powinno rozwiązać problem przez ustawienie katalogu roboczego dla pliku wsadowego z powrotem do bieżącego katalogu:

zawierać te dwie linie w górnej części skryptu bat:

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

Znalezione w : http://www.codeproject.com/Tips/119828/Running-a-bat-file-as-administrator-Correcting-cur

+1

To jest idealne. Rozwiązałem mój problem "nie znaleziono pliku" podczas uruchamiania pliku bat jako administrator. – pandalion98

0

Możesz CD bezpośrednio z nazwy pliku, dodając rodzica (nie testowane w Windows 8.x, ale działało "na zawsze", o ile pamiętam).

CD %FILENAME%\.. 

i dysk CD zmieni także dyski, używając/D, pokazanego powyżej, ale nie wymienionego wyraźnie, co może zostać pominięte. CD/D% FILENAME% \ ..

(FOR /? IF /? SET /? CALL /? GOTO /? wszystkim zapewnić wysoce użyteczny odczyt jeśli używasz cmd.exe, ja ponownie przeczytać je raz na jakiś czas.)

Powiązane problemy