0

XP/Vista/7 で動作する必要があります。バッチ、VBS、または言及された O/Ses を持つすべての人が実行できるもの (PE を除く) を使用できます。

15 個のランダムなファイルと、同様の名前のフォルダー (別の場所にあります) を選択し、同時にそれらを独自のフォルダーにコピーする必要があります。

私はグーグルや robvanderwoude.com のようなウェブサイトを精査し、いくつかの近い例を見つけましたが、経験が浅すぎて、斜視にならずに必要なものに例を適応させることができません. 誰かが私を正しい方向(最も効率的/最も簡単に使用できる方法)に向けることができれば幸いです.

レイアウトの説明:

30 files:
%~dp0\mod\store\XMLs -> %~dp0\mod\0.1.2\map\data  
map01_aaa.xml  
map02_bbb.xml  
map03_ccc.xml  
...  
map60_zzz.xml

30 folders:
%~dp0\mod\store\models -> %~dp0\mod\0.1.2\sky\stuff  
01_aaa_map  
02_bbb_map  
03_ccc_map  
...  
60_zzz_map

以下のコードは、これを採用しようとしているものですが、15 個のファイル/フォルダーのみを順番に選択します。SrcMax の方程式で %random% 環境変数を使用しようとしましたが、ランダムな量のファイルが選択され、常に最初のファイルから開始されます。
(古いコード)

rem @ECHO OFF
setlocal ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS
SET SrcCount=0
SET SrcMax=15

  FOR %%F IN (%~dp0\mod\store\XMLs\*.*) DO IF !SrcCount! LSS %SrcMax% (
  SET /A SrcCount += 1
  ECHO !SrcCount! COPY %%F %~dp0\mod\0.1.2\map\data\
  COPY %%F %~dp0\mod\0.1.2\map\data\
  SET FNAME=%%~nF
  ECHO XCOPY /s "%~dp0\mod\store\Models\!FNAME:~3!_map"  "%~dp0\mod\0.1.2\sky\stuff\!FNAME:~3!_map\"
  XCOPY /s "%~dp0\mod\store\Models\!FNAME:~3!_map"  "%~dp0\mod\0.1.2\sky\stuff\!FNAME:~3!_map\"
)
4

1 に答える 1

0

私はこれがうまくいくと信じています。

@echo off
setlocal enabledelayedexpansion
set XMLs_src=.\mod\store\XMLs
set XMLs_dest=.\mod\0.1.2\map\data
set maps_src=.\mod\store\models
set maps_dest=.\mod\0.1.2\sky\stuff

rmdir /q /s "%XMLs_dest%" 2>NUL
rmdir /q /s "%maps_dest%" 2>NUL
mkdir "%XMLs_dest%"
mkdir "%maps_dest%"

for /L %%X in (1,1,15) do (
    call :rnd rn
    call :xml !rn!
    call :map !rn!
)
copy "%XMLs_dest%\*.*" "%XMLs_src%" >NUL
echo d | xcopy /q /f /e /y "%maps_dest%\*" "%maps_src%" >NUL
echo Done.
goto :EOF

:rnd
set c=0
for /d %%I in (%maps_src%\*) do set /a c+=1 >NUL
set /a %1=%RANDOM% * %c% / 32768 + 1 >NUL
goto :EOF

:xml
set c=0
for /f %%I in ('dir /b /o:n "%XMLs_src%"') do (
    set /a c+=1 >NUL
    if !c!==%1 (
        echo %XMLs_src%\%%I -^> %XMLs_dest%\%%I
        move "%XMLs_src%\%%I" "%XMLs_dest%" >NUL
        goto :EOF
    )
)
goto :EOF

:map
set c=0
for /f %%I in ('dir /b /o:n "%maps_src%"') do (
    set /a c+=1 >NUL
    if !c!==%1 (
        echo %maps_src%\%%I -^> %maps_dest%\%%I
        echo d | xcopy /q /f /e /y "%maps_src%\%%I" "%maps_dest%\%%I" >NUL
        rmdir /q /s "%maps_src%\%%I"
        goto :EOF
    )
)
goto :EOF

基本的には、重複を防ぐために移動し、移動先から移動元にコピーして、移動したものを復元します。

于 2013-01-24T20:22:19.153 に答える