So erhalten Sie mit CMD den Ordnerpfad vom Dateipfad

151

Ich benötige einen Pfad zu dem Ordner, der die Cmd-Datei enthält. Mit% 0 kann ich den Dateinamen erhalten. Aber wie bekomme ich den Ordnernamen?

c: \ temp \ test.cmd >> test.cmd

PS Mein aktuelles Verzeichnis! = Ordner des Skripts.

Mike Chaliy
quelle

Antworten:

310

Für den Ordnernamen und das Laufwerk können Sie Folgendes verwenden:

echo %~dp0

Mit verschiedenen Modifikatoren können Sie viel mehr Informationen erhalten:

%~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

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

Dies ist eine Kopie einfügen aus dem "für /?" Befehl an der Eingabeaufforderung. Ich hoffe es hilft.

verbunden

Die Top 10 der DOS-Batch-Tipps (Ja, DOS-Batch ...) zeigen batchparams.bat (Link zur Quelle als Kern):

C:\Temp>batchparams.bat c:\windows\notepad.exe
%~1     =      c:\windows\notepad.exe
%~f1     =      c:\WINDOWS\NOTEPAD.EXE
%~d1     =      c:
%~p1     =      \WINDOWS\
%~n1     =      NOTEPAD
%~x1     =      .EXE
%~s1     =      c:\WINDOWS\NOTEPAD.EXE
%~a1     =      --a------
%~t1     =      08/25/2005 01:50 AM
%~z1     =      17920
%~$PATHATH:1     =
%~dp1     =      c:\WINDOWS\
%~nx1     =      NOTEPAD.EXE
%~dp$PATH:1     =      c:\WINDOWS\
%~ftza1     =      --a------ 08/25/2005 01:50 AM 17920 c:\WINDOWS\NOTEPAD.EXE
Wadih M.
quelle
Cool. Benötige ich eine bestimmte Punktzahl, um den Wiki-Beitrag eines anderen zu ändern?
Wadih M.
@ Wadih M.: Allgemein nützlicher Link stackoverflow.com/questions/18557/…
jfs
@ Wadih M.: Insbesondere stackoverflow.com/questions/130654/…
jfs
@Wadih M.: Über den obigen Link: "+750, um Community-Wiki-Beiträge zu bearbeiten"
jfs
Wenn Sie also möchten, dass ein Cmd-Skript das Arbeitsverzeichnis auf den Speicherort des Skripts setzt: cd /d "%~dp0"(von stackoverflow.com/questions/4451668 )
Nigel Touch
52

Die akzeptierte Antwort ist hilfreich, aber es ist nicht sofort ersichtlich, wie ein Dateiname aus einem Pfad abgerufen werden kann, wenn Sie KEINE übergebenen Werte verwenden. Ich konnte dies aus diesem Thread herausarbeiten, aber falls andere nicht so viel Glück haben, geht es folgendermaßen vor:

@echo off
setlocal enabledelayedexpansion enableextensions

set myPath=C:\Somewhere\Somewhere\SomeFile.txt
call :file_name_from_path result !myPath!
echo %result%
goto :eof

:file_name_from_path <resultVar> <pathVar>
(
    set "%~1=%~nx2"
    exit /b
)

:eof
endlocal

Jetzt kann die :file_name_from_pathFunktion überall verwendet werden, um den Wert abzurufen, nicht nur für übergebene Argumente. Dies kann äußerst hilfreich sein, wenn die Argumente in unbestimmter Reihenfolge an die Datei übergeben werden können oder der Pfad überhaupt nicht an die Datei übergeben wird.

NightOwl888
quelle
Wow, das ist beeindruckend! Windows Batch-Dateien unterstützen also Funktionen in derselben Datei. Wie nützlich! Seit wann war das möglich?
Luke
2
Ich mag es, dass Sie Variablen sowohl als Referenz (wie sie sind) als auch als Wert (umgeben von "!") Übergeben können. Ok, Sie haben wahrscheinlich keine "lokalen" Variablen und keinen Aufrufstapel ... aber hey: es ist immerhin ein cmd-Skript, es ist sowieso ein großer Schritt voraus;) Ich stimme zu, das Partitionieren von Sachen in eine einzelne Datei ist viel praktischer als es um mehrere Dateien
Luke
1
Ich denke, "goto: eof" sollte "goto eof" sein ... ohne Doppelpunkt ... da es für mich brach.
Ein Khudairy
2
Siehe auch: ss64.com/nt/syntax-args.html - nur %~dp1für Laufwerk und Pfad verwenden.
Andrew
2
@AKhudairy ist korrekt: ss64.com/nt/goto.html Mit dem Doppelpunkt überspringt der goto den Endlocal (und alles andere, was Sie danach setzen, wie eine Pause). Außerdem müssen Sie "s hinzufügen, !myPath!wenn Ihr Pfad Leerzeichen enthält (oder wenn die Anführungszeichen Teil von myPath sind)
Rick
8

Um diese Variablen zuzuweisen, dürfen Sie keine Leerzeichen vor oder nach dem Gleichheitszeichen einfügen:

set filepath=%~dp1
set filename=%~nx1

Dann sollten Sie keine Probleme haben.

Frank
quelle
5

Für den Fall, dass jemand eine alternative Methode wünscht ...

Wenn es das letzte Unterverzeichnis im Pfad ist, können Sie diesen Einzeiler verwenden:

cd "c:\directory\subdirectory\filename.exe\..\.." && dir /ad /b /s

Dies würde Folgendes zurückgeben:

c:\directory\subdirectory

Das .... fällt zurück zum vorherigen Verzeichnis. / ad zeigt nur Verzeichnisse an / b ist ein Bare-Format. Auflistung / en enthält alle Unterverzeichnisse. Dies wird verwendet, um den vollständigen Pfad des zu druckenden Verzeichnisses abzurufen.

Kennzeichen
quelle
Es funktioniert wahrscheinlich gegen das aktuelle Verzeichnis, nicht gegen ein Verzeichnis, in dem sich die Skriptdatei befindet.
Mike Chaliy
4

Ich hatte das gleiche Problem in meiner Schleife, in der ich Zip-Dateien im selben Verzeichnis extrahieren und dann die Zip-Datei löschen wollte. Das Problem war, dass 7z den Ausgabeordner benötigt, also musste ich den Ordnerpfad jeder Datei erhalten. Hier ist meine Lösung:

FOR /F "usebackq tokens=1" %%i IN (`DIR /S/B *.zip` ) DO (
  7z.exe x %%i -aoa -o%%i\..
) 

%% i war ein vollständiger Dateinamenpfad und% ii \ .. gibt einfach den übergeordneten Ordner zurück.

ich hoffe es hilft.

Gico
quelle
Schnell und dreckig. Ich mag es! Ich hätte nie gedacht, dass Sie einen Dateipfad mit "\ .." kalt erweitern und am Ende den übergeordneten Ordner haben.
Oliver R.
Dies funktionierte für mich unter Win10: FOR / R "C: \ sourceDir"% I IN (* .gz) DO C: \ 7-Zip64 \ 7z.exe x "% I" -aou -o% I \ .. \
b3wii
Ja! Dies umgeht das Problem, dass% ~ dp1 (usw.) nur auf% 0,% 1,% 2 usw.
funktioniert
3

Falls die von Wadih akzeptierte Antwort bei Ihnen nicht funktioniert hat, versuchen Sie es echo %CD%

Naguib Ihab
quelle
0

Dies wurde mit einem bearbeiteten Beispiel cmd zusammengestellt

@Echo off

Echo ********************************************************
Echo *  ZIP Folder Backup using 7Zip                        *
Echo *  Usage: Source Folder, Destination Drive Letter      *
Echo *  Source Folder will be Zipped to Destination\Backups *
Echo ********************************************************
Echo off

set year=%date:~-4,4%
set month=%date:~-10,2%
set day=%date:~-7,2%
set hour=%time:~-11,2%
set hour=%hour: =0%
set min=%time:~-8,2%

SET /P src=Source Folder to Backup: 
SET source=%src%\*
call :file_name_from_path nam %src%
SET /P destination=Backup Drive Letter:
set zipfilename=%nam%.%year%.%month%.%day%.%hour%%min%.zip
set dest="%destination%:\Backups\%zipfilename%"


set AppExePath="%ProgramFiles(x86)%\7-Zip\7z.exe"
if not exist %AppExePath% set AppExePath="%ProgramFiles%\7-Zip\7z.exe"

if not exist %AppExePath% goto notInstalled

echo Backing up %source% to %dest%

%AppExePath% a -r -tzip %dest% %source%

echo %source% backed up to %dest% is complete!

TIMEOUT 5

exit;

:file_name_from_path <resultVar> <pathVar>
(
    set "%~1=%~nx2"
    exit /b
)


:notInstalled

echo Can not find 7-Zip, please install it from:
echo  http://7-zip.org/

:end
PAUSE
Steve Seymour
quelle