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


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

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2011/10/02 22:50:06

ベストアンサー

id:thrillseeker No.3

回答回数328ベストアンサー獲得回数37

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

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

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

id:NaMgAlSiPSClArKCa

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

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

2011/10/02 22:50:02

その他の回答2件)

id:thrillseeker No.1

回答回数328ベストアンサー獲得回数37

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

@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! として参照出来るようにする為の設定です。

また、一時利用した環境変数の初期化処理を最後に

追加しました。

id:NaMgAlSiPSClArKCa

少し分からない所があるのですが

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

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

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

2011/10/02 21:54:59
id:thrillseeker No.2

回答回数328ベストアンサー獲得回数37

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)
)
id:NaMgAlSiPSClArKCa

ありがとう御座います!

先ほど返信した時後に内容を編集したのでもう一度質問したいのですが

フォルダ名に!が入るフォルダを指定するので、エラーが出てしまいます

、遅延展開をするのではなくサブルーチン化するときはどうしたらいいのでしょうか?

サブルーチン化したら、%%fが使えない、と思うのですが

2011/10/02 22:31:47
id:thrillseeker No.3

回答回数328ベストアンサー獲得回数37ここでベストアンサー

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

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

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

id:NaMgAlSiPSClArKCa

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

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

2011/10/02 22:50:02
  • id:cx20
    > サブルーチン化したら、%%fが使えない、と思うのですが

    サブルーチン化した場合は
    CALL :SUB %%f
    と呼び出すことで、
    :SUB
    ECHO %1
    のように、引数は %1, %2, %3, ... として参照することができます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません