今天我尝试做一个脚本,自动将一些文件移动到我的游戏文件夹(使用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,但最好还是说你为什么不做同样的错误;)
答案 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"