人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

バッチファイルのファイル操作について質問です

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行目の置き換えに使うため)
という操作はできないでしょうか?

●質問者: NaMgAlSiPSClArKCa
●カテゴリ:コンピュータ 学習・教育
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● thrillseeker

下記で出来ると思います。

@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!の&ってどういう意味があるのですか?

遅延展開をするのではなくサブルーチン化することはできるでしょうか?(実行するフォルダの名前に!が入ってるので)

質問が多くなってしまいすみません


2 ● thrillseeker
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が使えない、と思うのですが


3 ● thrillseeker
ベストアンサー

そうですね、for do文では copy をせず、選ばれたファイル名を

環境変数に一旦格納するだけにしておいて、その後にその環境変数

を参照して copy をするのはどうですか?

◎質問者からの返答

環境変数に格納しとけばいいんですね!

何から何までありがとう御座います!

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ