需要成为一个简单的脚本,任何拥有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
希望有意义,如果不是我会去睡觉,明天再试一次。我读了十几个与彻底移动随机文件有关的问题(例如this one),谷歌的几个小时,以及阅读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个文件。此外,移动文件夹的代码不起作用,它只会移动文件。
答案 0 :(得分: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!\"
)
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
代码正在我的机器上运行。我不知道如何能得到更多的帮助。
是什么!FNAME:~3!意思是,特别是〜3?
这是一个子串操作,它会删除前三个字符。
我们从%% F中的Map01_aaa.xml
开始:
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.
我的不好,文件夹名称实际上是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\"