C:\pictureの中などの画像ファイルpngをランダムに1つだけ選択する
という操作を
for /r "C:\picture" %%f in (*.png) do set /a b=b+1
set PF=%RANDOM%
set /a S = PF %% b
copy "C:\picture\picture%S%.png" "C:\A" /y
というようにAファイルにコピーする内容なのですが
pictureフォルダの中の画像ファイルをpicture数字.pngというようにリネームをいちいちしないといけないのですが
フォルダの中の画像をランダムに選択して、その画像ファイルの名前を取得(4行目の置き換えに使うため)
という操作はできないでしょうか?
そうですね、for do文では copy をせず、選ばれたファイル名を
環境変数に一旦格納するだけにしておいて、その後にその環境変数
を参照して copy をするのはどうですか?
下記で出来ると思います。
@echo off set N=0 for /r "C:\picture" %%f in (*.png) do set /a N=N+1 set /a PF=%RANDOM%*%N%/32768 set N=0 setlocal ENABLEDELAYEDEXPANSION for /r "C:\picture" %%f in (*.png) do set /a N=N+1 & if !N! EQU %PF% (copy "C:\picture\%%f" "C:\A" /y) setlocal DISABLEDELAYEDEXPANSION set N= set PF=
setlocal の部分は、2回目のfor文内での N の変化を
if文で !N! として参照出来るようにする為の設定です。
また、一時利用した環境変数の初期化処理を最後に
追加しました。
少し分からない所があるのですが
>set /a PF=%RANDOM%*%N%/32768
この行は結局はPFにNの値を代入してるということでいいのですか?
そして
>for /r "C:\picture" %%f in (*.png) do set /a N=N+1 & if !N! EQU %PF% (copy "C:\picture\%%f" "C:\A" /y)
この行の真ん中ぐらいのN=N+1 & if !N!の&ってどういう意味があるのですか?
遅延展開をするのではなくサブルーチン化することはできるでしょうか?(実行するフォルダの名前に!が入ってるので)
質問が多くなってしまいすみません
set /a PF=%RANDOM%*%N%/32768
%N% は、"C:\picture\*.png" のファイル数です。
上記の処理で、PF に 0からN-1 の間の値の乱数が設定されます。
★今気付きましたが、ここは正しくは
set /a PF=(%RANDOM%*%N%/32768)+1
として PF が 1からNの間の乱数になるようにしないといけませんね。
あと、%%f にはフルパスが入るので copy の時のディレクトリ名挿入は
不要でした。ごめんなさい。
修正版:
@echo off set N=0 for /r "C:\picture" %%f in (*.png) do set /a N=N+1 set /a PF=(%RANDOM%*%N%/32768)+1 set N=0 setlocal ENABLEDELAYEDEXPANSION for /r "C:\picture" %%f in (*.png) do set /a N=N+1 & if !N! EQU %PF% (copy "%%f" "C:\A" /y) setlocal DISABLEDELAYEDEXPANSION set N= set PF=
set文とif文を繋いでいる & ですが、do の処理に
複数のコマンドを割り当てるのに使っています。
for 条件 in () do cmd1 & cmd2
とすると、cmd1 と cmd2 が for ループが回る度に両方実行されます。
以下のように () でくくるのと同じ意味です。
for /r "C:\picture" %%f in (*.png) do ( set /a N=N+1 if !N! EQU %PF% (copy "%%f" "C:\A" /y) )
ありがとう御座います!
先ほど返信した時後に内容を編集したのでもう一度質問したいのですが
フォルダ名に!が入るフォルダを指定するので、エラーが出てしまいます
、遅延展開をするのではなくサブルーチン化するときはどうしたらいいのでしょうか?
サブルーチン化したら、%%fが使えない、と思うのですが
そうですね、for do文では copy をせず、選ばれたファイル名を
環境変数に一旦格納するだけにしておいて、その後にその環境変数
を参照して copy をするのはどうですか?
環境変数に格納しとけばいいんですね!
何から何までありがとう御座います!
環境変数に格納しとけばいいんですね!
何から何までありがとう御座います!