【问题标题】:How to move random amount of files & folders with similar names?如何移动随机数量的具有相似名称的文件和文件夹?
【发布时间】:2013-01-23 11:25:48
【问题描述】:

需要一个简单的脚本,任何使用 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),几个小时的google,以及阅读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 个文件。移动文件夹的代码也不起作用,它只会移动文件。

【问题讨论】:

  • 原始代码移动了随机 number 个文件,但不会随机选择它们,总是从头开始选择。您现在已设置为始终复制前 15 个。
  • 我应该指定的,想不出如何措辞,抱歉。也许我会尝试重新提交一个新问题。
  • 在文件布局描述中你说源文件是C:/game/store/XMLs(斜线是相反的,我厌倦了每次复制/粘贴它们时都重新输入它们),但是在你的 .bat从 `C:\game\mod\store\XMLs` 复制的文件。哪个是正确的?
  • 修复并接受了您的回答。我会得到这个工作,再次感谢您的帮助。
  • Yes 完美,您的答案从一开始就是正确的。我非常感谢您抽出宝贵时间彻底回答问题并解释内容。现在再做一些阅读以弄清楚如何随机选择文件。可能最终会在下周提交另一个问题。 :]

标签: windows batch-file vbscript


【解决方案1】:

如果您发布您正在工作的 .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?

这是一个子字符串操作,它会删除前三个字符。

我们从 %%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.

更新 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\"

【讨论】:

  • 感谢您抽出宝贵时间回复。我将您的代码添加到最后,但它没有做任何事情。没有文件夹被复制。我已经用我拥有的代码更新了这个问题。
  • @user2003492。什么都不做? 任何东西。 没有打印任何消息?如果你在一开始就关闭回声会发生什么?你看到了什么?我的猜测是目标目录不存在。也许您的目录设置与问题中描述的不同。我正在发布更新。
  • !FNAME:~3! 是什么意思意味着,特别是~3?我不好,文件夹名称实际上是 01_aaa_map 等等。相关输出:SET FNAME=map60_zzz XCOPY /s "C:\game\mod\store\models\!FNAME:~3\game\mod\0.1.2\sky\stuff\!FNAME:~3!\")
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-15
  • 2022-11-25
  • 1970-01-01
相关资源
最近更新 更多