Windows 10, in meinem eigenen Videos-Ordner unter UserProfile.
Ich versuche, ein paar Dinge aneinanderzureihen, um eine vollständige TXT-Datei mit verschiedenen Informationen in einer einzigen Befehlszeile zu erstellen, richtig.
.txt
Das Ziel besteht darin, eine einzelne Textdatei mit einer Kopfzeile, einigen generierten Informationen und einer Fußzeile zu erstellen. Der Text erhält der Einfachheit halber den gleichen Namen wie der Ordnername mit am Ende.
Ich möchte die Befehlsfolge einmal pro Ordner ausführen und da es ziemlich viele Aufrufe des Zielordnernamens gibt, habe ich mir überlegt, ihn mithilfe einer Variablen zu verkürzen.
type header.txt > VeryLongFolderNameFooBar\VeryLongFolderNameFooBar.txt & c:\mediainfo\mediainfo.exe --output=file://template.txt ./VeryLongFolderNameFooBar/*.mkv >> VeryLongFolderNameFooBar\VeryLongFolderNameFooBar.txt & type footer.txt >> VeryLongFolderNameFooBar\VeryLongFolderNameFooBar.txt
Dies funktionierte absolut einwandfrei, allerdings wurde es ziemlich mühsam, den Ordnernamen für alle Vorkommen zu ändern. Warum also nicht eine Variable verwenden?
set a=VeryLongFolderNameFooBar && type header.txt>%a%\%a%.txt & c:\mediainfo\mediainfo.exe --output=file://template.txt ./%a%/*.mkv>>%a%\%a%.nfo & type footer.txt>>%a%\%a%.txt
Dies gibt drei access denied
Meldungen aus. Anfangs habe ich vor und nach den Variablenaufrufen Leerzeichen verwendet und diese entfernt, nachdem ich einen Beitrag gelesen hatte, dass Leerzeichen Dinge durcheinander bringen können, aber immer noch ohne Erfolg und ich stecke wirklich fest. Wenn ich echo %a%
das mache, wird der Ordnername ohne Probleme zurückgegeben.
Was vermisse ich?
Antwort1
CMD durchsucht die gesamte Zeile nach Variablen, bevor es sie tatsächlich verarbeitet. Daher ersetzt es sie %a%
durch null (oder was auch immer zuvor eingestellt wurde), bevor es den set a=...
Befehl verarbeitet. Sie müssen das in einer separaten Zeile tun:
set a=VeryLongFolderNameFooBar
type header.txt>%a%\%a%.txt & c:\mediainfo\mediainfo.exe --output=file://template.txt ./%a%/*.mkv>>%a%\%a%.nfo & type footer.txt>>%a%\%a%.txt
Aber zusätzlich (wie Sie festgestellt haben) set
enthält der Befehl (dummerweise, meiner Meinung nach) alles bis zu einem Befehlstrennzeichen. Also
set a=SoLong & echo /%a%/
a
wird auf (mit einem abschließenden Leerzeichen) gesetzt SoLong
. Eine Möglichkeit, damit umzugehen, besteht darin, das Leerzeichen vor dem wegzulassen &
:
set a=SoLong& echo ...
aber das wird allgemein als weniger lesbar angesehen. Eine etwas schönere Lösung besteht darin, den set
Befehl in Klammern zu setzen:
(set a=SoLong) & echo ...
Der Wert wird also durch beendet )
.