変数を使用してファイル名に出力するときにアクセスが拒否されました

変数を使用してファイル名に出力するときにアクセスが拒否されました

Windows 10、UserProfile の下の自分のビデオ フォルダー内。

いくつかのものをつなぎ合わせて、さまざまな情報を含む完全な txt ファイルを 1 つのコマンド ラインで作成しようとしています。

目標は、ヘッダー、生成された情報、およびフッターを含む単一の txt を作成することです。 txt の名前は、.txt簡潔にするために、末尾に が付いたフォルダー名と同じ名前になります。

私はフォルダーごとにコマンドの文字列を 1 回実行することを目指しており、対象となるフォルダーの名前への呼び出しがかなり多いため、変数を使用して短縮することにしました。

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

これは完全に完璧に機能しましたが、すべての発生に対してフォルダー名を変更するのは非常に面倒なので、変数を使用しないのはなぜでしょうか?

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

これにより、3 つのaccess deniedメッセージが表示されます。最初は変数呼び出しの前後にスペースを使用していましたが、スペースがあると問題が発生する可能性があるという投稿を読んでからスペースを削除しましたが、それでも効果がなく、本当に困っています。これを行うと、echo %a%フォルダー名が問題なく返されます。

何が足りないのでしょうか?

答え1

CMD は、実際に処理する前に行全体をスキャンして変数を探します。したがって、コマンド%a%を処理する前に、null (または以前に設定された値) に置き換えますset a=...。これは別の行で行う必要があります。

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

しかし、さらに(あなたが発見したように)、setコマンドには(愚かなことに、私見では)コマンドセパレーターまでのすべてが含まれています。つまり

set a=SoLong & echo /%a%/

a(末尾にスペースが付きます)に設定されますSoLong 。これに対処する 1 つの方法は、 の前のスペースを省略することです&

set a=SoLong& echo ...

しかし、これは読みにくいと広く考えられています。もう少し良い解決策は、setコマンドを括弧で囲むことです。

(set a=SoLong) & echo ...

したがって、値は によって終了します)

関連情報