Aktuellen Ordnernamen mit einem DOS-Befehl abrufen?


49

Ist es möglich, den aktuellen Ordnernamen (nicht den aktuellen Verzeichnispfad) mit einem DOS-Befehl abzurufen? Wenn das so ist, wie?

Das Nächste, was ich bekam, war das, aber es macht es nicht:

for /f "delims=\" %%a in ("%CD%") do set CURR=%%a
echo.DIR: %CURR%

Hinweis: Bei dem obigen Versuch habe ich versucht, die Zeichenfolge zu tokenisieren und das letzte als CURR-Variable festgelegte Token abzurufen.


Wenn Sie eine Art GNU-Toolset installiert haben, sollten Sie in der Lage sein zu gehen cd | sed "s/.*\\//" (Das leitet die Ausgabe von cd (cwd) in einen regulären Ausdruck zum Suchen und Ersetzen um, wobei alles vor dem finalen \ durch gar nichts ersetzt wird.)
Phoshi

2
Ich muss GNU-Tools meiden, damit die Batch-Datei überall für jedermann funktioniert. Meine Frage ist sowieso für "reines DOS".
djangofan

In Ordung. Eine schnelle Google zeigte ein SO-Ergebnis für die Implementierung von Regex-Suchen und Ersetzen in VBScript ( stackoverflow.com/questions/127318/… ), die die gleiche Syntax verwenden und das gleiche Ergebnis erzielen könnten - ich glaube, VBScript wurde seit Windows 98 eingebaut, sollte also für jeden etwas dabei sein! (Sie können es auch sehr einfach neu auslösen, damit es auch unter * nix OS 'funktioniert.)
Phoshi

3
Zu Ihrer Information auch nicht for /f noch TomWijs %~n* werden in MS-DOS unterstützt. (Windows ' cmd.exe ist nicht DOS, Es ist ein natives Windows-Programm.)
grawity

Antworten:


71

Kürzester Weg, den ich gefunden habe:

for %I in (.) do echo %~nxI

oder innerhalb eines .bat-Skripts:

for %%I in (.) do echo %%~nxI

oder in .bat mit Get value in variable.

for %%I in (.) do set CurrDirName=%%~nxI
echo %CurrDirName%

Erläuterung: http://www.robvanderwoude.com/ntfor.php

nx bedeutet nur Dateiname und Erweiterung


Ich mag den Link und den Vorschlag, aber wenn ich das in eine Batch-Datei lege, bekomme ich ein sofortiges Schließen der Shell ohne Ausgabe. muss da irgendwo ein syntaxfehler drin sein?
djangofan

3
Das Beispiel wird interaktiv in der Befehlszeile ausgeführt. Um es in einer Batch-Datei zu verwenden, müssen Sie alle Vorkommen von ersetzen % mit %%.
Mike Fitzpatrick

2
Außerdem werden im Beispiel Ordnernamen, die einen Punkt enthalten, nicht korrekt behandelt ( . ), z. B. mein Ordner% USERPROFILE%.
Mike Fitzpatrick

1
Ja, funktioniert, wenn Sie '%' durch '%%' ersetzen. Gute Antwort. Wäre die akzeptierte Antwort gewesen, wenn das früher vermerkt worden wäre.
djangofan

1
Was auch immer diese gottesfürchtige böse Zauberei ist, ich bin froh, dass es funktioniert. Ich bin mit den meisten Expansionssyntax vertraut, habe sie aber noch nie gesehen * benutzt damit vor o.o.
kayleeFrye_onDeck

30

Geben Sie Folgendes ein, wenn Sie den aktuellen Speicherort der Batchdatei ermitteln möchten (und wenn Windows keine sehr alte Version ist) for /? in einem DOS-Fenster. Runterscrollen. Lesen.

Sie werden feststellen, dass Sie jetzt lesen können (von innerhalb die Batch-Datei) diese Variablen:

%0      - as the name how this batchfile was called
%~d0    - as the drive letter where this batchfile is located ('\\' in case of share)
%~p0    - as path (without the drive letter) where this batchfile is located
%~n0    - as filename (without suffix) of this batchfile
%~x0    - as filename's suffix (without filename) of this batchfile
%~a0    - as this batchfile's file attributes
%~t0    - as this batchfile's date+time
%~z0    - as this batchfile's filesize
%~dpnx0 - as this batchfile's fully qualified path+filename
[... and then some more ...]

Dies funktioniert in vielen Fällen. Angenommen, die Batchdatei wird aufgerufen mytest.bat. Sie können es auf verschiedene Arten aufrufen:

  1. ..\..\to\mytest.bat ............................... (relativer Pfad)
  2. d:\path\to\mytest.bat ........................... (vollständigen Pfad)
  3. \\fileserver\sharename\mytest.bat ... (Pfad auf der Remote-Freigabe)

... und Sie erhalten immer den richtigen Wert in Ihren Variablen.


1
wow, interessanterweise hast du recht. Der Befehl "echo% ~ dp0" löst auch mein Problem und es ist eleganter.
djangofan

4
Ok dann - willst du mir dann eine '+1' geben?
Kurt Pfeifle

Nein, aus dem Grund, dass 'für /?' war der offensichtliche erste Ort, an dem ich gesucht habe und daher ist diese Antwort nicht besser als das, was von irgendjemandem erwartet wird.
djangofan

3
@ Djangofan: Also sagst du "Wow, interessanterweise hast du recht ..." zu etwas, das du schon wusstest ?! Auf eine Antwort, die nicht zu Ihrem Wissen beigetragen hat? (Du weißt, '+1' klickt auf den ^ -Pfeil - es ist anders als eine Antwort machen die akzeptierte ....)
Kurt Pfeifle

1
es scheint, dass der letzte sein sollte %~dpnx0ist nicht?
luc

15

Ich persönlich mochte Toms Antwort, bis es mit Punkten in Dir-Namen zu kämpfen hatte. Diese gab mir einen Tipp:

for /f "delims=\" %%a in ("%cd%") do echo topmost dir: %%~nxa

5

Toms Antwort ist gut, aber wenn Sie einen Verzeichnisnamen mit einem Punkt (d. H. Wxwidgets-2.9.4) haben, erhalten Sie nur den vollständigen Namen. Dies würde also stattdessen wxwidgets-2.9 ​​ausgeben, da die .4 als Erweiterung behandelt wurde (Ja, obwohl es ein Verzeichnisname ist!).

Um den vollständigen Ausgabenamen zu erhalten, müssen Sie am Ende der Erweiterung Folgendes hinzufügen:

FOR %I IN (.) DO Echo %~nI%~xI

und im Batch-Dateimodus:

FOR %%I IN (.) DO Echo %%~nI%%~xI

Oder setzen Sie stattdessen eine Variable in die Batch-Datei:

FOR %%I IN (.) DO SET CurrentD=%%~nI%%~xI

4

Ein anderer Weg ist:

set "MyPath=%~dpnx0" & call set "MyPath=%%MyPath:\%~nx0=%%" 
echo MyPath=%MyPath%  

es funktioniert mit "." und Leerzeichen im Pfadnamen

Was tut es?

  1. Setzen Sie den gesamten Dateinamen (Laufwerkbuchstaben-Pfad-Dateinamenerweiterung) in MyPath Var

  2. Entfernen Sie den Dateinamen und die Erweiterung von MyPath var

Es funktioniert auch mit UNC-Pfaden. Wenn Sie den Backslash am Ende des Pfads benötigen. Entferne das \ nach dem MyPath im zweiten Set-Befehl, z.

set "MyPath=%%MyPath:%~nx0=%%"

1
Wie unterscheidet sich das von %~dp0
Amit Naidu

4

Sie können das aktuelle Verzeichnis in eine Variable übernehmen. Einzeiler:

set a=%cd%

Überprüfen Sie mit

echo %a%

4
Er möchte den aktuellen Verzeichnisnamen, nicht den gesamten Pfad, und als == cd können Sie auch% cd% verwenden.
paradroid

1

Meine Antwort in dieser Thread macht es in 3 einfachen Zeilen:

@echo off
SET "CDIR=%~dp0"
:: for loop requires removing trailing backslash from %~dp0 output
SET "CDIR=%CDIR:~0,-1%"
FOR %%i IN ("%CDIR%") DO SET "PARENTFOLDERNAME=%%~nxi"
ECHO Parent folder: %PARENTFOLDERNAME%
ECHO Full path: %~dp0
pause>nul

1

nur einfach

for %%d in ("%CD%") do echo %%~nxd

oder

set "sPath=."
for %%d in ("%sPath%") do set "sDirName=%%~nxd"

Achten Sie auf den umgekehrten Schrägstrich am Ende des Pfades, er muss nicht am Ende des Pfades stehen.


1

Das funktioniert bei mir aus einer Batch-Datei. Es gibt den aktuellen Arbeitsverzeichnisnamen zurück.

pushd %1 & for %%i in (.) do @echo %%~ni
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.