使用dir批量获取文件夹目标(cmd)并复制+粘贴找到的名称文件夹中的文件

时间:2017-12-27 01:40:50

标签: windows batch-file cmd automation

今天我尝试做一个脚本,自动将一些文件移动到我的游戏文件夹(使用xcopy)。这是一个简单的批处理,但我的问题是,几乎每个月,我需要移动文件的文件夹都在变化。 而且我真的很懒,所以我有办法保存实际的destionation文件夹(路径),比如使用" dir"并将其保存在变量中,以便可以用作xcopy的目的地。

链接在这里 - > Architecture tree

重要的是,只有1个文件夹编辑:存在于目标文件夹(可能更容易?)。

以下是我的想法,但它不起作用,可能是因为有太多的信息。

  

来源 - > d:\ MyMods

     

全名:D:\ config \ Games \ WoWS \ Mods \ 6)Skins \ All_Skins(Modified)\

     

目的地 - > * L:\游戏\ MODS的\ 0.6.15.0 *

     

全名:L:\ Games \ World_of_Warships \ res_mods

set version = dir "L:\Games\World_of_Warships\res_mods"
  

中间结果 - >版本= 0.6.15.0

xcopy "D:\source\" "L:\Games\World_of_Warships\res_mods\%version%\" /E /Y
  

最终结果 - > L:\游戏\ World_of_Warships \ res_mods \ 0.6.15.0 \ FILES_COPIED

PS:我几乎失去了所有关于批量的概念,但通过一些研究,我通常会发现我想要做的事情,但在这里,我无法找到它: |

全部谢谢

编辑:最终成立" dir / AD / B"给了我正确的名称文件夹,但现在我需要保存它,或者在我的xcopy中使它可以使用

尝试:(不工作)

set version=NotSet
dir /AD /B "L:\Games\World_of_Warships\res_mods" > %version%

最后,经过多次尝试,我得到了一些东西,但它只是不起作用,原因是我无法看到:

dir /AD /B "L:\Games\World_of_Warships\res_mods" > version.txt
set /P version=<version.txt
set "destination=L:\Games\World_of_Warships\res_mods\%version%\"
set "source=D:\config\Games\WoWS\Mods\6) Skins\All_Skins(Modified)\"
xcopy %source% %destination% /E /Y

echo %destination%
echo %source%

结果如下:

  

参数数量无效---&gt; 为什么?

     

L:\ Games \ World_of_Warships \ res_mods \ 0.6.15.0 \ ---&gt; 正确

     

D:\ config \ Games \ WoWS \ Mods \ 6)Skins \ All_Skins(Modified)\ ---&gt; 正确

EDIT2:我缩短了文件夹的名称以便更轻松地计划&#34;然后我只需要使用一些&#34;在路径之前和之后,它应该工作。但显然,它比任何事情都给予更多麻烦。对不起。

谢谢你-1,但最好还是说你为什么不做同样的错误;)

2 个答案:

答案 0 :(得分:0)

for /d %%d in ("destination\*") do xcopy /y "source\*" "%%d\"

其中source是您的源目录(D:\ MyMods),destination是您的目标目录的父目录(L:\ game \ mods),其中只包含一个子目录(0.1。 4.7)

- 修改为正确的目的地规范 -

这是我的测试设置,所以没有误解:

@ECHO Off
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir\mods"
for /d %%d in ("%destdir%\*") do xcopy /y /e "%sourcedir%\*" "%%d\"

DIR /s "%destdir%"
DIR /s "%sourcedir%"

GOTO :EOF

请注意,我从/e中省略了xcopy - 我通常使用/s,但看起来我需要更改我的政策......

U:\destdir\mods下只有一个子目录,U:\sourcedir下的整个子树都被复制到该子目录下。

再次尝试,这次使用文件名和目录名中的括号和空格。

稍微修改过的代码。源目标和目标目录名已更改为包括括号和空格。 dir/s用于报告目录树​​结构,find用于过滤...,这只会使输出混乱。

@ECHO Off
SETLOCAL
SET "sourcedir=U:\sourcedir\t (w) o"
SET "destdir=U:\destdir\mo (d) s"
ECHO --- before structure ---
DIR /s "%sourcedir%"|FIND /v " ."
DIR /s "%destdir%"|FIND /v " ."
ECHO -------------------------

for /d %%d in ("%destdir%\*") do xcopy /y /e "%sourcedir%\*" "%%d\"

ECHO --- after structure ---

DIR /s "%destdir%"|FIND /v " ."

GOTO :EOF

结果

--- before structure ---
 Volume in drive U has no label.
 Volume Serial Number is 3490-2000

 Directory of U:\sourcedir\t (w) o

28/12/2017  22:01                 0 dum myfile2.txt
28/12/2017  22:01    <DIR>          subd (i) r1
28/12/2017  22:01    <DIR>          subd (i) r2
28/12/2017  22:01                 0 fil (e)_1.txt
28/12/2017  22:01                 0 fil (e)_2.txt
               3 File(s)              0 bytes

 Directory of U:\sourcedir\t (w) o\subd (i) r1

28/12/2017  22:01                 0 fil (e)_3.ext
28/12/2017  22:01                 0 fil (e)_4.ext
28/12/2017  22:01                 0 fil (e)_5.ext
               3 File(s)              0 bytes

 Directory of U:\sourcedir\t (w) o\subd (i) r2

28/12/2017  22:01                 0 fil (e)_3.ext
28/12/2017  22:01                 0 fil (e)_4.ext
28/12/2017  22:01                 0 fil (e)_5.ext
               3 File(s)              0 bytes

     Total Files Listed:
               9 File(s)              0 bytes
               8 Dir(s)   2,592,260,096 bytes free
 Volume in drive U has no label.
 Volume Serial Number is 3490-2000

 Directory of U:\destdir\mo (d) s

28/12/2017  22:01    <DIR>          0.6.( 15 ).0
               0 File(s)              0 bytes

 Directory of U:\destdir\mo (d) s\0.6.( 15 ).0

               0 File(s)              0 bytes

     Total Files Listed:
               0 File(s)              0 bytes
               5 Dir(s)   2,592,260,096 bytes free
-------------------------
U:\sourcedir\t (w) o\dum myfile2.txt
U:\sourcedir\t (w) o\fil (e)_1.txt
U:\sourcedir\t (w) o\fil (e)_2.txt
U:\sourcedir\t (w) o\subd (i) r1\fil (e)_3.ext
U:\sourcedir\t (w) o\subd (i) r1\fil (e)_4.ext
U:\sourcedir\t (w) o\subd (i) r1\fil (e)_5.ext
U:\sourcedir\t (w) o\subd (i) r2\fil (e)_3.ext
U:\sourcedir\t (w) o\subd (i) r2\fil (e)_4.ext
U:\sourcedir\t (w) o\subd (i) r2\fil (e)_5.ext
9 File(s) copied
--- after structure ---
 Volume in drive U has no label.
 Volume Serial Number is 3490-2000

 Directory of U:\destdir\mo (d) s

28/12/2017  22:01    <DIR>          0.6.( 15 ).0
               0 File(s)              0 bytes

 Directory of U:\destdir\mo (d) s\0.6.( 15 ).0

28/12/2017  22:01                 0 dum myfile2.txt
28/12/2017  22:01                 0 fil (e)_1.txt
28/12/2017  22:01                 0 fil (e)_2.txt
28/12/2017  22:01    <DIR>          subd (i) r1
28/12/2017  22:01    <DIR>          subd (i) r2
               3 File(s)              0 bytes

 Directory of U:\destdir\mo (d) s\0.6.( 15 ).0\subd (i) r1

28/12/2017  22:01                 0 fil (e)_3.ext
28/12/2017  22:01                 0 fil (e)_4.ext
28/12/2017  22:01                 0 fil (e)_5.ext
               3 File(s)              0 bytes

 Directory of U:\destdir\mo (d) s\0.6.( 15 ).0\subd (i) r2

28/12/2017  22:01                 0 fil (e)_3.ext
28/12/2017  22:01                 0 fil (e)_4.ext
28/12/2017  22:01                 0 fil (e)_5.ext
               3 File(s)              0 bytes

     Total Files Listed:
               9 File(s)              0 bytes
              11 Dir(s)   2,592,251,904 bytes free

所以 - 我只能说它适用于我,空格,括号和所有......

答案 1 :(得分:0)

根据我的理解,您收到此邮件的原因是您的source变量值的错误且不必要的回溯斜杠。

这应该不起作用:

Set "destination=L:\Games\World_of_Warships\res_mods\%version%\"
Set "source=D:\config\Games\WoWS\Mods\6) Skins\All_Skins(Modified)\"
XCopy "%source%" "%destination%" /E /Y

这可能适用于(可选)

Set "destination=L:\Games\World_of_Warships\res_mods\%version%\"
Set "source=D:\config\Games\WoWS\Mods\6) Skins\All_Skins(Modified)"
XCopy "%source%" "%destination%" /E /Y

这应该工作(推荐)

Set "destination=L:\Games\World_of_Warships\res_mods\%version%"
Set "source=D:\config\Games\WoWS\Mods\6) Skins\All_Skins(Modified)"
XCopy "%source%" "%destination%" /E /Y

总而言之,您的脚本将如下所示:

Dir /B/AD-S-L "L:\Games\World_of_Warships\res_mods">"version.txt"
Set /P "version="<"version.txt"
Set "destination=L:\Games\World_of_Warships\res_mods\%version%"
Set "source=D:\config\Games\WoWS\Mods\6) Skins\All_Skins(Modified)"
XCopy "%source%" "%destination%" /E /Y

Echo=%destination%
Echo=%source%

修改

要绕过文本文件的使用,您可以用以下内容替换上面的前三行:

For /D %%A In ("L:\Games\World_of_Warships\res_mods\*") Do Set "destination=%%~fA"

请记住,当您只有一个时,这将充分检索完整路径目录名称

如果您需要安全,为了确保您使用的是最近创建的目录名,那么您可以使用此代码:

CD /D "L:\Games\World_of_Warships\res_mods" 2>Nul || Exit /B
For /F "Delims=" %%A In ('Dir /B/AD-S-L/OD/TC') Do Set "destination=%%~fA"

修改2

根据最新评论请求:

Set "destination="
For /D %%A In ("L:\Games\World_of_Warships\res_mods\*"
) Do If Not Defined destination Set "destination=%%~fA"

或者使用Dir进行排序以确保您获得正确的第一个。 /ON按名称排序,/O-N按名称排序,或类似/OD|/O-D按日期/TC|/TW创建或书写:< / p>

CD /D "L:\Games\World_of_Warships\res_mods" 2>Nul || Exit /B
Set "destination="
For /F "Delims=" %%A In ('Dir /B/AD-S-L/ON'
) Do If Not Defined destination Set "destination=%%~fA"