0

XP / Vista / 7を使用している人なら誰でも実行できる単純なスクリプトである必要があります(PEまたはPowershellは使用できません)。

ランダムな量のファイル(例:1-15)と、同様の名前のフォルダー(別の場所にある)を同時に独自のフォルダーに移動する必要があります。30個のファイルと30個のフォルダーから選択できます。

C:\game\store\XMLs -> C:\game\mod\0.1.2\map\data  
map01_aaa.xml  
map02_bbb.xml  
map03_ccc.xml  
...  
map60_zzz.xml

C:\game\store\models -> C:\game\mod\0.1.2\sky\stuff  
01_aaa_map  
02_bbb_map  
03_ccc_map  
...  
60_zzz_map

そうでなければ、私が寝て、明日もう一度やり直します。ランダムファイルの完全な移動(このようなものなど)、数時間のグーグル、robvanderwoude.comの閲覧に関連する十数の質問を読みましたが、あまり経験がありません。誰かが何をすべきか、何を読むべきか、またはこれを達成するために私が取り組むことができる例を与えることができるという提案があれば、私はそれをいただければ幸いです。

編集:これは私がこれまでに持っているコードであり、jimharkからの回答で更新されています:

@ECHO OFF & setlocal ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS
SET SrcCount=0
SET SrcMax=15
FOR %%F IN (C:\game\mod\store\XMLs\*.*) DO IF !SrcCount! LSS %SrcMax% (
SET /A SrcCount += 1
ECHO !SrcCount! COPY %F C:\game\mod\0.1.2\map\data\
COPY %%F C:\game\mod\0.1.2\map\data\
SET FNAME=%%~nF
XCOPY /s "C:\game\mod\store\models\!FNAME:~3!"  "C:\game\mod\0.1.2\sky\stuff\!FNAME:~3!\"
)

ただし、ファイルをランダムに選択するわけではありません。たとえば、%RANDOM %%% 15を使用しても、常に最初の8つのファイルが移動します。また、フォルダを移動するコードは機能せず、ファイルのみを移動します。

4

1 に答える 1

0

作業中の.batコードを投稿すると非常に役立ちます。それがなければ、リンクしたコードに基づいて、おそらく次のようなものを追加する必要があると言えます。

まず、これを上部に追加します。

setlocal ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS

次に(そして私は古いコードを書き直しませんでしたが、最後の2つの新しい行が必要なものになるはずです):

FOR %F IN (C:\temp\source\*.*) DO IF !SrcCount! LSS %SrcMax% (
    SET /A SrcCount += 1
    ECHO !SrcCount! COPY %F C:\temp\output
    COPY %F C:\temp\output

    rem ** Here are the new lines **

    SET FNAME=%%~nF
    XCOPY /s "C:\game\store\0.1.2\sky\stuff\!FNAME:~3!"  "C:\game\mod\0.1.2\sky\stuff\!FNAME:~3!\"
)

アップデート1

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

IF NOT EXIST C:\game\mod\0.1.2\map\data md C:\game\mod\0.1.2\map\data
IF NOT EXIST C:\game\mod\0.1.2\sky\stuff md C:\game\mod\0.1.2\sky\stuff

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

以前の私のファイルシステムは次のとおりです。

C:\game>dir /s /b
C:\game\mod
C:\game\mod\store
C:\game\mod\store\models
C:\game\mod\store\XMLs
C:\game\mod\store\models\01_aaa
C:\game\mod\store\models\01_aaa\test.txt
C:\game\mod\store\XMLs\Map01_aaa.xml

これが後です:

C:\game>dir /s /b
C:\game\mod
C:\game\mod\0.1.2
C:\game\mod\store
C:\game\mod\0.1.2\map
C:\game\mod\0.1.2\sky
C:\game\mod\0.1.2\map\data
C:\game\mod\0.1.2\map\data\Map01_aaa.xml
C:\game\mod\0.1.2\sky\stuff
C:\game\mod\0.1.2\sky\stuff\01_aaa
C:\game\mod\0.1.2\sky\stuff\01_aaa\test.txt
C:\game\mod\store\models
C:\game\mod\store\XMLs
C:\game\mod\store\models\01_aaa
C:\game\mod\store\models\01_aaa\test.txt
C:\game\mod\store\XMLs\Map01_aaa.xml

そして、これが出力です:

D:\bat>docopy.bat

D:\bat>rem @ECHO OFF
D:\bat>setlocal ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS
D:\bat>SET SrcCount=0
D:\bat>SET SrcMax=15
D:\bat>IF NOT EXIST C:\game\mod\0.1.2\map\data md C:\game\mod\0.1.2\map\data
D:\bat>IF NOT EXIST C:\game\mod\0.1.2\sky\stuff md C:\game\mod\0.1.2\sky\stuff

D:\bat>FOR %F IN (C:\game\mod\store\XMLs\*.*) DO IF !SrcCount! LSS 15 (
SET /A SrcCount += 1
 ECHO !SrcCount! COPY %F C:\game\mod\0.1.2\map\data\
 COPY %F C:\game\mod\0.1.2\map\data\
 SET FNAME=%~nF
 ECHO XCOPY /s "C:\game\mod\store\models\!FNAME:~3!"  "C:\game\mod\0.1.2\sky\stuff\!FNAME:~3!\"
 XCOPY /s "C:\game\mod\store\models\!FNAME:~3!"  "C:\game\mod\0.1.2\sky\stuff\!FNAME:~3!\"
)

D:\bat>IF !SrcCount! LSS 15 (
SET /A SrcCount += 1
 ECHO !SrcCount! COPY C:\game\mod\store\XMLs\Map01_aaa.xml C:\game\mod\0.1.2\map\data\
 COPY C:\game\mod\store\XMLs\Map01_aaa.xml C:\game\mod\0.1.2\map\data\
 SET FNAME=Map01_aaa
 ECHO XCOPY /s "C:\game\mod\store\models\!FNAME:~3!"  "C:\game\mod\0.1.2\sky\stuff\!FNAME:~3!\"
 XCOPY /s "C:\game\mod\store\models\!FNAME:~3!"  "C:\game\mod\0.1.2\sky\stuff\!FNAME:~3!\"
)

1 COPY C:\game\mod\store\XMLs\Map01_aaa.xml C:\game\mod\0.1.2\map\data\
        1 file(s) copied.
XCOPY /s "C:\game\mod\store\models\01_aaa"  "C:\game\mod\0.1.2\sky\stuff\01_aaa\"
C:\game\mod\store\models\01_aaa\test.txt
1 File(s) copied

D:\bat>c:

C:\game>dir /s /b

コードは私のマシンで機能しています。どうすればもっと助けられるのかわかりません。

アップデート2

!FNAME:〜3!とは つまり、特に〜3?

これは部分文字列操作であり、最初の3文字を削除します。

Map01_aaa.xml%%Fのようなものから始めます。

SET FNAME=%%~nF

ファイル名だけを引き出しますMap01_aaa。それで:

!FNAME:~3!

01_aaa必要なディレクトリ名であると指定したの最初の3文字を削除します。

C:\>set test=abcdef
c:\>echo !test:~3!
def

set /?

May also specify substrings for an expansion.

%PATH:~10,5%

would expand the PATH environment variable, and then use only the 5
characters that begin at the 11th (offset 10) character of the expanded
result.

アップデート3

そして、私の悪いことに、フォルダ名は実際には01_aaa_mapなどです。

次に変更します。

XCOPY /s "C:\game\mod\store\models\!FNAME:~3!"  "C:\game\mod\0.1.2\sky\stuff\!FNAME:~3!\"

に:

XCOPY /s "C:\game\mod\store\models\!FNAME:~3!_map"  "C:\game\mod\0.1.2\sky\stuff\!FNAME:~3!_map\"
于 2013-01-23T13:20:56.760 に答える