2
多くのサブフォルダのそれぞれからN個のランダムファイルを抽出するコードがあります。感嘆符付きのファイルを除いて正常に動作します。遅延拡張を使用して、2番目のforループの感嘆符を消去します。 2番目のループで展開を無効にすると、中間結果(File1、File2、File3 ...)を取り込むために変数内の変数を使用できなくなります。助けて!遅延拡張はCatch22の状況にあります
@echo off
chcp 1254
REM Display N random episodes from each sub-folder in g:\itunes\podcasts
setlocal EnableDelayedExpansion
set /p COUNT=Select Desired Number of Random Episodes per Album:
REM Recurse the podcast directory
for /d %%f in (G:\itunes\Podcasts\*) do (
set "buffer=%%f"
set n=0
REM http://stackoverflow.com/questions/18945521/need-to-create-a-batch-file-to-select-one-random-file-from-a-folder-and-copy-to
for %%g in ("!buffer!\*") do (
set /A n+=1
set "file!n!=%%g"
)
for /l %%i in (1, 1, !COUNT!) do (
set /A "rand=(!n!*!random!)/32768+1"
REM http://stackoverflow.com/questions/9700256/bat-file-variable-contents-as-part-of-another-variable
for %%A in ("!rand!") do echo !file%%~A!
)
)
forループ内で 'call:label parameters'を使ってサブ関数を呼び出します。その後、あなたは遅延拡張を必要としません。 –
@Noodlesはあなたのコメントに基づいて答えを出します。しかし、私は生の 'call:setfile'を使ってパラメータを指定しないでください。代わりに変数 'buffer' _before_' call:setfile'を設定してください。最後の 'for %% A'ループの代わりに別のサブルーチン':echofile'を呼び出すことを検討してください。 – JosefZ
あるいは、遅延拡張をトグルして、必要に応じてのみ有効にし、 '%% i 'のような' for'変数を読むときに無効にするようにします。 'endlocal'の後に環境(変数)の変更がなくなったとみなす必要があります... – aschipfl