2016-06-25 4 views
0

d:\testの各サブディレクトリから1つのファイルを取り出し、f:\sourceに入れてください。これは行いますが、ランダム化部分は機能しません。各フォルダの各ファイルは作成日に基づいて選択され、各フォルダの最後の「作成済み」ファイルは常にf:\sourceに表示されます。なぜこのスクリプトは実際にはランダム化されていないのですか?

なぜでしょうか?

setlocal EnableDelayedExpansion 
cd D:\test 
set t=0 
for /d %%i in (*) do (
    cd "%%i" 
    set /A t+=1 
    set n[!t!]=0 
    for %%f in (*.*) do (
     set /A n[!t!]+=1 
     set "file[!n!]=%%f" 
    ) 
    set /A "rand=(n[!t!]*%random%)/32768+1" 
    copy "!file[%rand%]!" f:\source 
    cd.. 
) 
pause 
+1

クラシック

  • set /?
  • pushd /?
  • popd /? は、拡張問題を遅らせました。 '%random%'の代わりに '!random!'を使用してください – SomethingDark

  • 答えて

    0

    すべて%VariableName%はループの最初のの全体コマンドブロックを解析する上で、既にWindowsのコマンドプロセッサによって展開されています。これには%random%%rand%が含まれます。

    可能な限り遅延展開を避けるために、コードをよりシンプルにするためにサブルーチンを使用することをお勧めします。使用するコマンドを理解し、どのように彼らは、コマンドプロンプトウィンドウを開き、そこに次のコマンドを実行し、完全にページが非常に慎重に、各コマンドのために表示されているすべてのヘルプを読んで、仕事のため

    @echo off 
    pushd d:\test 
    for /D %%i in (*) do (
        cd "%%i" 
        call :CopyRandomFile 
        cd ..\ 
    ) 
    popd 
    pause 
    goto :EOF 
    
    :CopyRandomFile 
    setlocal EnableDelayedExpansion 
    set "FileNumber=0" 
    for %%f in (*.*) do (
        set /A FileNumber+=1 
        set "File[!FileNumber!]=%%f" 
    ) 
    set /A "rand=(FileNumber * %random%)/32768 + 1" 
    copy "!File[%rand%]!" f:\source 
    endlocal 
    goto :EOF 
    

    • call /?
    • cd /?
    • copy /?
    • echo /?
    • endlocal /?
    • for /?
    • goto /?
    • setlocal /?
    関連する問題