Zugriff verweigert bei der Ausgabe in Dateiname mit Variable

Zugriff verweigert bei der Ausgabe in Dateiname mit Variable

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.

.txtDas 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 deniedMeldungen 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) setenthält der Befehl (dummerweise, meiner Meinung nach) alles bis zu einem Befehlstrennzeichen. Also

set a=SoLong & echo /%a%/

awird 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 setBefehl in Klammern zu setzen:

(set a=SoLong) & echo ...

Der Wert wird also durch beendet ).

verwandte Informationen