Gelegentlich kann die Unfähigkeit der cmd-Shell, Platzhalterpfade zu erweitern, wirklich zu Unannehmlichkeiten führen. Ich musste 100 Dateien in einem Verzeichnis an ein Programm übergeben und konnte * .ext nicht eingeben. Stattdessen habe ich mingws 'ls' verwendet, um die Liste in eine Datei zu kopieren, und dann die Zeilenumbrüche durch Leerzeichen ersetzt, kopiert und in cmd eingefügt. Ein wahrer Albtraum.
Ich vermute, die Antwort wird nein sein, aber hat sich jemand damit befasst oder eine Möglichkeit gefunden, dies zu vereinfachen?
windows-7
command-line
wildcards
batch
cemulieren
quelle
quelle
I suspect the answer will be no, but has anyone dealt with this or come up with any way to make this easier?
Tatsächlich habe ich das gegenteilige Problem. Ich versuche herauszufinden, wie der Befehlsinterpreter seine Liste als Zeichenfolgen behandeln und verhindern kann, dass sie als Platzhalter interpretiert werden. Zum Beispielfor %i in (foobar baz really?) do @echo %i
wird das letzte Element (Behandlungreally?
) als Dateinamen Platzhalter, und es überspringt , wenn es keine Dateien mit dem Namen sindreally1
,reallyz
usw. ☹?
ist kein legales Zeichen für Dateinamen im Windows-Dateisystem. Das Zeichen kann nur als Platzhalter interpretiert werden. Siehe Benennen von Dateien, Pfaden und Namespaces in MSDN und Verwenden von Platzhalterzeichen in TechNet.Antworten:
DOS und folglich Windows
cmd.exe
unterstützten niemals die Platzhaltererweiterung durch die Shell. Es lag immer an der Anwendung, die Erweiterung durchzuführen.Dies bedeutet, dass Sie immer eine andere Route suchen müssen, wenn Sie eine Anwendung verwenden, die keine Erweiterung unterstützt. Du könntest:
dir /b > list.txt
die verwendendir
Befehl , um die Expansion durchzuführen und setzt die Liste der Dateien in eine Textdatei (Sie dann so etwas wie eine Excel - Formel verwenden könnten , wenn Sie wirklich verzweifelt sind eine Liste von Befehlen zu erzeugen , in einfügencmd
, oder Sie können Excel verwenden um die Zellen so zu transponieren, dass sich alle Dateinamen in derselben Zeile befinden.)quelle
Verwenden Sie einfach Powershell, das unter Windows 7 vorinstalliert ist. Powershell kann Cmd-Befehle ausführen und versteht Platzhalter an jeder Stelle in einem Pfad.
Um Powershell zu starten, geben Sie einfach "Powershell" in Ihr Startmenü ein und drücken Sie die Eingabetaste.
Falls die Anwendung eine Zeichenfolge mit allen Dateinamen erwartet, ist dies das richtige Skript:
Wechseln Sie
$delimiter = " "
zu,$delimiter = ","
wenn Ihre Anwendung eine durch Kommas getrennte Liste von Dateinamen erwartet.Erklärung des Codes:
[string]$files = $nothing
- Erstellt eine leere Variable vom Typstring
;
- ist ein Trennzeichen für mehrere Befehle, keine Pipeline!ls *.txt | % { $files += $_.fullname + $delimiter }
- Ruft eine Liste aller Textdateien ab und erstellt eine Zeichenfolge mit allen durch das Trennzeichen getrennten Dateinamenapplication.exe $files
- ruft die Anwendung auf und übergibt ihr die DateilisteSie können sogar rekursiv nach einem Dateimuster suchen, indem Sie es hinzufügen
-recurse
,ls *.txt
sodass der vollständige Code folgendermaßen aussieht:Bearbeiten:
Um Irritationen zu vermeiden
ls
unddir
Aliase vonGet-ChildItem
und%
ist ein Alias fürForEach-Object
. Ich behalte meinen Code mit verwendeten Aliasen, weil er kürzer ist.EDIT 25.04.2018:
2012 war ich noch ziemlich neu in PowerShell. Natürlich gibt es einen einfacheren Weg, obwohl er nicht so einfach ist wie die Fähigkeit von Unix / Linux zur Glob-Erweiterung:
app.exe $(ls *.txt | % {$_.FullName})
Erläuterung:
ls *.txt
Ruft FileInfo-Objekte aller Dateien ab, die mit dem Glob übereinstimmen*.txt
% { $_.FileName }
tut das für uns. durchläuft%
alle von denls
Objekten zurückgegebenen Elemente und gibt jeden Dateinamen aus.quelle
start notepad++ *.txt
(mit Absicht , alle Text - Dateien zu öffnen - gebrauchte Notepad ++ , wie es funktioniert mehrere Namen handhaben ) führt zu nichtsdir *.txt | % { notepad++.exe $_ }
. Ich habe das mit einem einfachen Notizblock versucht, weil ich keinen Notizblock ++ habe, und es hat funktioniert. Der Befehl empfängt eine Liste aller txt-Dateien im aktuellen Verzeichnis, gibt die Liste an den nächsten Befehl weiter, der die Liste durchläuft und notepad ++ mit dem Dateinamen als Parameter ausführt.grep "a b c"
nach, eine der aufgelisteten Zeichenfolgen zu finden , bei denen "ab c" eine erweiterte Liste wärecopy a+b+c result
undcopy a result
copy b result
copy c result
. (und grep wie Utility gibt es in PS, es heißtselect-string
)Dies gibt Ihnen eine Liste und legt sie auch in die Variable mit dem Namen
expanded_list
. Legen Sie es in die Batch-Datei und führen Sie mitmyBatchFile name myPattern
. Schließen Sie das Muster in Anführungszeichen ein, wenn es Leerzeichen enthält. Stimmt mit Dateien überein, keine Verzeichnisse. Ohne Parameter ausführen stimmt mit allen überein.Sie können dann Ihren Befehl mit ausführen
my_command_exec %expanded_list%
WARNUNG! Die maximale Größe der cmd-Variablen beträgt 8191 Zeichen (ab XP), daher ist ein Überlauf möglich! Sie können sich nicht darauf verlassen, dass das Dienstprogramm immer eine vollständige Liste enthält. Andererseits beträgt die maximale cmd-Zeilenlänge auch 8191, sodass Sie sie ohnehin nicht ausführen können.
quelle
Dies funktioniert in cmd.exe
oder
quelle
dir /b TortoiseSVN\bin\sv*.exe
wird zeigensvn.exe
undsvnadmin.exe
. Aberdir /b TortoiseSVN\bi*\svn.exe
zeigt ein Syntaxfehler.dir /s /b
. Dies gibt Ihnen den vollständigen Pfad.Beachten Sie, dass dies in Kommentar zu den Postern in einem separaten Thread steht (user619818 und styfle)
Mit DIR können und können Sie in allen Unterverzeichnissen nach Dateien suchen, die einem bestimmten Typ entsprechen.
Hinweis: Als Stammverzeichnis zur Überprüfung, unter welchem alle Unterverzeichnisse liegen, wird "C: \ My Program \ Root \" angenommen, da der Autor keinen Pfadnamen angegeben hat, unter dem sich diese Verzeichnisse befinden
Dadurch werden die vollständigen Dateipfade und Dateinamen der Quelldateien angegeben.
Wenn Sie nur Dateinamen möchten, müssen Sie wie folgt vorgehen
Angenommen, Sie möchten alle diese Dateien von "C: \ My Program \ Root \ Sub Directories \ *. ext" nach "D: \ Singlefolder \ *. ext" verschieben.
Hoffe das hilft anderen in Zukunft. :)
quelle
Dies ist alt, aber mit dem Linux-Subsystem für Windows ist es ziemlich üblich, Bash in Ihrem PATH zu haben. Wenn dies der Fall ist, könnte dies den Trick für Sie tun:
quelle