1

タイトルが示すように、さらに処理するために、フォルダーから最大 4 つのランダムなファイル (壁紙) を選択しようとしています。フォルダーにはサブフォルダーは含まれず、*.jpg、*.bmp、および *.png のみです ( Thumbs.db ファイルが含まれている可能性がありますが、既に処理済みです)。配列に似たものを作成

するループですべてのファイルを読み取り、ファイルを選択するためのインデックスとして機能する乱数を作成するために別のループを実行したいと思います。forfor

setlocal enabledelayedexpansion
set "wps=1 2 3 4"
set /a ind = 0

for /f "tokens=* delims=" %%g in ('dir C:\Wallpapers /a:-h-s /b /s') do (
    set /a ind += 1
    set "!ind!=%%g"
)

for %%g in (%wps%) do (
    set /a "num = (((!random! & 1) * 1073741824) + (!random! * 32768) + !random!) %% %ind% + 1"
    echo Wallpaper %%g is #!num! - Title: "!!num!!"
)


もちろん、エコーする行はWallpaper 1 is #118 - Title: "118"代わりに出力するだけですWallpaper 1 is #118 - Title: "C:\Wallpapers\Miami Skyline.jpg"

したがって、私の具体的な質問は、ループ内で変数を二重に展開するにはどうすればよいですか?for

[注 #1: 乱数を作成する行は非常に長くする必要があります。これは、適切なランダムな値の分布を与えるためです]
[注 #2:wpsそのように保存する必要があります。必然的に番号順に]

4

2 に答える 2

1

!num! を転送します。FOR変数への値:-)

for %%N in (!num!) do echo Wallpaper %%g is #%%N - Title: "!%%N!"

いくつかの追加のポインタ:

  • 書かれているように、DIRコマンドにはフォルダーが含まれています。/A-Dオプションを追加する必要があります

    dir C:\Wallpapers /a:-h-s-d /b /s

  • 数値変数名は既存のコードで機能します。ただし、通常の展開を使用してそれらにアクセスしようとする%1%と、環境変数の代わりに最初のバッチ引数として展開されるため、適合します。一般的には、環境変数を数字で始めることは避けるべきです。あなたが使用することができます:

    set wp!ind!=%%g
    ...
    echo Wallpaper %%g is #!num! - Title: "!wp%%N!

  • ループの上部ではなく下部でカウンターをインクリメントすることにより、配列を0ベースにすることができます。次に、乱数に 1 を追加する必要はありません。(このヒントは些細なことです。スタイルの問題です。)

  • "tokens=*"との両方は必要ありません"delims="。私は後者をお勧めします。"delims="文字列全体を保持します。先頭のスペースとタブを取り除いたtokens=*、文字列全体を保持します。ファイル名はスペースで始めることができます。

  • ファイル名に!文字が含まれている場合、コードは失敗します。%%gエクスクラメーションは、展開が遅れているため、展開中に破損します。遅延展開のオンとオフを切り替え、FOR 変数を使用して ENDLOCAL バリアを越えて値を転送することで、かなり簡単に修正できます。

すべての推奨事項が配置されたコードは次のとおりです

@echo off
setlocal disableDelayedExpansion
set "wps=1 2 3 4"
set /a ind = 0

for /f "tokens=* delims=" %%g in ('dir C:\Wallpapers /a:-h-s-d /b /s') do (
  setlocal enableDelayedExpansion
  for %%N in (!ind!) do (
    endlocal
    set "wp%%N=%%g"
  )
  set /a ind += 1
)

setlocal enableDelayedExpansion
for %%g in (%wps%) do (
  set /a "num = (((!random! & 1) * 1073741824) + (!random! * 32768) + !random!) %% %ind%"
  for %%N in (!num!) do echo Wallpaper %%g is #%%N - Title: "!wp%%N!"
)
于 2012-06-11T10:40:57.347 に答える
0

提案された dbenham のような別の FOR を使用することも、使用することもできますCALL

call echo Wallpaper %%g is #!num! - Title: "%%!num!%%"

ACALLは 2 回目に行を展開しますが、行の 2 回目の再解析ではパーセント展開のみが機能し、遅延展開も FOR ループ展開も機能しません。

編集:これは、num の内容が数字で始まらない場合にのみ機能します。

しかし、もう一度展開するために使用できますcmd /c。その後、数値名でも機能します。

cmd /c echo Wallpaper %%g is #!num! - Title: "%%!num!%%"
于 2012-06-11T10:57:24.387 に答える