【问题标题】:Batch using dir to get folder destination (cmd) and copy+paste files in name's folder found使用 dir 批量获取文件夹目标 (cmd) 并在找到的名称文件夹中复制+粘贴文件
【发布时间】:2018-06-07 16:44:11
【问题描述】:

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


链接在这里 --> Architecture tree

重要,只有 1 个文件夹 EDIT:存在于目标文件夹中(可能更简单?)。

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

来源 -> D:\MyMods

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

目的地 -> *L:\games\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:\Games\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%

结果如下:

参数数量无效---> 为什么?

L:\Games\World_of_Warships\res_mods\0.6.15.0\ ---> 正确

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

EDIT2:我缩短了文件夹的名称以便更容易“计划”,然后我只需要在路径之前和之后使用一些“,然后它应该可以工作。但显然,它会带来更多麻烦比什么都好。很抱歉。

感谢-1,但最好说明你为什么这样做,以免犯同样的错误;)

【问题讨论】:

  • 你是想说在`L:\game\mods`下总会有一个唯一的文件夹吗?
  • 是的,我就是这个意思,因为每次创建其他目录时,旧的目录都会被删除(通过另一种方式,所以我不需要用这个脚本在这里删除它)。
  • @Drexx,您希望 d:\MyMods 包含 L:\Games\Mods 的镜像还是只是将任何新位复制到目标?
  • @jwdonahue 我在设备 D: 上的文件夹中获取了我的 mods 文件,我想将其中包含的所有内容复制并粘贴到我的游戏文件夹(L:设备)中,但每次,我必须手动完成,现在我想要一个脚本来自动完成 :)

标签: windows batch-file cmd automation


【解决方案1】:

据我了解,您收到此消息的原因是您的 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 用于创建或编写)

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"

【讨论】:

  • @jwdonahue,问题出在反斜杠上,尝试使用已知目录作为测试,至少您的源目录不能有尾部反斜杠。获取目录名称的方式并不重要(提供的方法有效,如 OP 的问题所示),添加尾部反斜杠会阻止它复制 (除非您在其后使用通配符).
  • @jwdonahue,OP 说他们使用了dir /AD /B "L:\Games\mods" &gt; version.txt 然后set /P version=&lt;version.txt 他们接着显示&gt; L:\Games\mods\0.6.15.0\ ---&gt; Correct。他们的帖子说只有一个目录,代码似乎可以充分识别它,并且他们声明它是正确的是不可否认的。显而易见的是,只需从 %source% 中删除尾部反斜杠即可修复错误并按预期复制文件。
  • 他们的代码位于靠近他们当前问题的底部的格式化块中。它包含五个主要行,他们的前两个工作如他们所展示的那样,接下来的三个在我上面的答案中被替换,你真的希望我展示他们已经工作的dirset /P 行,当他们在技术上需要做的所有事情时是删除一两个反斜杠吗?
  • 不,我不想要你的任何东西,真的。我不应该发表第一条评论。已删除评论。我会在一两天内循环回来删除这个。
  • @jwdonahue 嗯,我试过带\或不带,有什么区别......但是我一直在使用一些\,因为在目录的真实名称中,有一些空格,和() ,这是一个原因,我做到了
【解决方案2】:
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

请注意,我从xcopy 中省略了/e - 我通常使用/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

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

【讨论】:

  • 当我在路径后不使用*时,它说“访问路径无效”,当我使用它时,它说File not found - *
  • 你指的是哪个*?
  • for /d %%d in ("destination\ *
  • 仍然收到相同的消息:“找不到文件 - *”和“复制了 0 个文件”
  • 我是否可能收到此消息,因为有“空格”和 ()?
猜你喜欢
  • 1970-01-01
  • 2015-01-16
  • 2021-02-11
  • 1970-01-01
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
  • 2016-03-01
  • 1970-01-01
相关资源
最近更新 更多