Batch-Befehl zum Speichern eines Ordnernamens in einer Datei in einer Zeile


1

Ich habe eine Liste von Ordnern in einem Verzeichnis, ich muss nur den gesamten Ordnernamen in eine Datei kopieren und die Datei sollte in einer durch Trennzeichen getrennten Zeile stehen. kann mir jeder dabei helfen in einer batch datei.

Vielen Dank


2
Was hast du bisher versucht?
Siva Charan

@SivaCharan Es ist nicht so einfach, da Echo eine neue Zeile erzeugt.
Barlop

Der in cmd.exe eingebaute Befehl echo unterstützt dies nicht, aber die in die Unix-Shells eingebauten Echos fügen eine -nOption hinzu, mit der der Zeilenumbruch unterdrückt wird.
Nicole Hamilton

Antworten:


1

Im Batch würden Sie es so machen:

@echo off

setlocal EnableDelayedExpansion

for /D %%f in (*.*) do set n=!n!;%%f

if defined n echo %n:~1% > list.txt

endlocal

Um in Unterordner zurückzukehren, ersetzen Sie /Dmit /Rund *.*mit ..

for /R %%f in (.) do set n=!n!;%%f

Indem Sie der Schleifenvariablen Qualifikationsmerkmale hinzufügen, können Sie angeben, ob Sie nur den Namen des Ordners ( %%~nxf) oder den vollständigen Pfad ( %%~dpnxf) möchten .


Dies bekommt nur die Dateien, keine Unterverzeichnisse. Das könnte bedeuten, was das OP meinte, aber ich interpretierte seine Frage (vielleicht fälschlicherweise) so, dass ich das Gegenteil verlangte, nur subdirs, keine Akten. Aber ich habe dir trotzdem eine positive Bewertung für die Ausführung mit cmd.exe gegeben.
Nicole Hamilton

Mein Fehler. Ich habe die /Dzur Verzeichnisaufzählung vergessen . Es ist jetzt in meiner Antwort behoben.
Ansgar Wiechers

0

Es gibt keinen einzelnen Stapelverarbeitungsdateibefehl, der das tut, was Sie wollen, aber Sie können eine Stapelverarbeitungsdatei verwenden, um die Aufgabe auszuführen, und zwar callvon Ihrer eigenen. Die Antwort von Ansgar Wiechers hatte die richtige Grundidee (ich sehe, er hat seine Version repariert, nachdem ich meine veröffentlicht habe).

Wie auch immer, hier ist eine Version, die eine durch Semikolons getrennte Liste von Unterordnern der ersten Ebene entweder im aktuellen Verzeichnis oder als Argument an dieses übergibt. Ich habe ein Semikolon-Trennzeichen anstelle eines Kommas gewählt, weil es niemals Teil eines gültigen Dateinamens sein könnte (und Kommas können es sein, obwohl es ungewöhnlich ist).

Wenn ein bestimmter Ordnername Leerzeichen enthält, muss er wie folgt in Anführungszeichen gesetzt werden (andernfalls ist die Angabe des Verzeichnispfads des Ordners optional):

subdirs "C:\Documents and Settings"

Beachten Sie, dass die Liste nur auf der Konsole (stdout) gedruckt wird. Wenn Sie diese also in einer Datei speichern möchten, müssen Sie > filename.extnach dem Skriptdateinamen (und einem beliebigen Ordnernamen) ein anhängen , um die Ausgabe in eine Datei Ihrer Wahl umzuleiten :

subdirs C:\Windows > dirlist.txt

== subdirs.bat ==

@echo off
setlocal EnableDelayedExpansion
pushd %1
for /D %%d in (*.*) do set n=!n!;%%d
if defined n echo %n:~1%
popd
endlocal

Wenn Sie möchten , den vollständigen Pfad zu jedem Ordnernamen erzeugen, können Sie die Änderung set n=!n!;%%dan set n=!n!;%%~fdder forRingleitung.


Könnte einfacher sein, cdin das Stammverzeichnis zu gelangen, als dem Muster einen Pfad voranzustellen:if "%1" neq "" cd "%1"
Ansgar Wiechers,

@Ansgar Wiechers: Sie haben Recht, aber es muss das aktuelle Verzeichnis gespeichert und wiederhergestellt werden, damit dies kein dauerhafter Nebeneffekt ist. Ich werde das zusammen mit einer weiteren geplanten Vereinfachung berücksichtigen. Danke für den Vorschlag.
Martineau

+1 für pushd. Ich habe das seit Ewigkeiten nicht mehr benutzt.
Ansgar Wiechers

@Ansgar Wiechers: Nochmals vielen Dank. Ich habe meine Antwort noch weiter vereinfacht, nachdem ich festgestellt habe, dass die Überprüfung, ob ein Ordnerpfadargument angegeben wurde oder nicht, nicht wirklich notwendig war. Ich habe auch das Trennzeichen in ein Semikolon geändert, um Verwechslungen mit möglichen Unterordnernamen zu vermeiden.
Martineau
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.