无忧启动论坛

标题: 批处理代码优化 [打印本页]

作者: jxyun99    时间: 2022-10-22 20:11
标题: 批处理代码优化
有段代码,目的是把C盘的几个文件夹做成目录链接,放到其他盘,下面的代码可以实现目的,但是感觉代码太繁琐了(目前还只是弄的三个文件夹,如果多几个文件夹,那不是代码更多切重复),不知道有没优化的可能?

@echo off
set linkPath=C:\one
set targetPath=K:\one
robocopy "%linkPath%" "%targetPath%" /e /copyall /xj
rmdir "%linkPath%" /s /q
mklink /j "%linkPath%" "%targetPath%"

set linkPath=C:\two
set targetPath=K:\two
robocopy "%linkPath%" "%targetPath%" /e /copyall /xj
rmdir "%linkPath%" /s /q
mklink /j "%linkPath%" "%targetPath%"

set linkPath=C:\three
set targetPath=K:\three
robocopy "%linkPath%" "%targetPath%" /e /copyall /xj
rmdir "%linkPath%" /s /q
mklink /j "%linkPath%" "%targetPath%"
pause


作者: sunsea    时间: 2022-10-22 20:26
本帖最后由 sunsea 于 2022-10-22 20:32 编辑
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION

  3. set linkPath=C:\one;C:\two;(此处添入更多,英文分号分割,最后一个不需有分号)
  4. set targetPath=K:\one;K:\two;(此处添入更多,英文分号分割,最后一个不需有分号)


  5. :cmdsb
  6. for /f "delims=; tokens=1,*" %%i in ("!linkPath!") do (
  7.         for /f "delims=; tokens=1,*" %%I in ("!targetPath!") do (
  8.                 rem 务必看清楚了下面的i、I、j、J!
  9.                 robocopy "%%i" "%%I" /e /copyall /xj
  10.                 rmdir "%%i" /s /q
  11.                 mklink /j "%%i" "%%I"
  12.                 set linkPath=%%j
  13.                 set targetPath=%%J
  14.         )
  15. )
  16. if not "!linkPath!"=="" goto :cmdsb

  17. rem CMD处理机制非常sb,不见换行符不认为是下一项,分号分割字符串只处理第一个,所以必须使用奇技淫巧

  18. pause
复制代码
手写的,【强烈建议先小规模测试】!



作者: DOSforever    时间: 2022-10-22 20:31
提示: 作者被禁止或删除 内容自动屏蔽
作者: jxyun99    时间: 2022-10-22 20:39
sunsea 发表于 2022-10-22 20:26
手写的,【强烈建议先小规模测试】!

感谢,试试先
作者: jxyun99    时间: 2022-10-22 20:39
DOSforever 发表于 2022-10-22 20:31
for %f in (on two three) do (
robocopy "C:\%f%" "K:\%f%" /e /copyall /xj
mklink /j "K:\%f%" "C:\ ...

谢谢
作者: DOSforever    时间: 2022-10-22 20:48
提示: 作者被禁止或删除 内容自动屏蔽
作者: jxyun99    时间: 2022-10-22 20:54
DOSforever 发表于 2022-10-22 20:48
你原来的语句中 mklink 似乎把 target 和 link name 两个参数位置弄反了。

没反吧,要做软链接的文件夹在C盘,要把C盘的那几个文件夹转移到K盘,源语句测试是没问题的,目的就是给C盘减肥,当初很多软件都安装在C盘,又不想重装软件,这样做目录链接后,C盘就可以减很多肥了
作者: jxyun99    时间: 2022-10-22 21:04
sunsea 发表于 2022-10-22 20:26
手写的,【强烈建议先小规模测试】!

测试了,好使!
但还有点困难就是因为linkPath和targetPath的多个路径分别都写在同一行,文件夹不多的时候也许好维护,但是如果有多个长路径时,就感觉不好维护了(毕竟如果有多个长路径,那就很难直观的看出哪个对应哪个了),现在有点想法,能不能通过读取config.txt的方式,让源文件和目标文件分别链接这样后期维护起来也非常方便,如config.txt的格式
C:\linkPath;K:\targetPath
C:\linkPath2;K:\targetPath2
C:\linkPath3;K:\targetPath3
C:\linkPath4;K:\targetPath4
这样哪个文件对应哪个就清晰明了了

作者: DOSforever    时间: 2022-10-22 21:07
提示: 作者被禁止或删除 内容自动屏蔽
作者: magicgenius    时间: 2022-10-22 21:51
这样的比较直观,方便增减。

@echo off
:one
set linkPath=C:\one
set targetPath=K:\one
call :Start

:two
set linkPath=C:\two
set targetPath=K:\two
call :Start

:three
set linkPath=C:\three
set targetPath=K:\three
call :Start

goto :Eof
:Start
robocopy "%linkPath%" "%targetPath%" /e /copyall /xj
rmdir "%linkPath%" /s /q
mklink /j "%linkPath%" "%targetPath%"

作者: sunsea    时间: 2022-10-22 22:47
本帖最后由 sunsea 于 2022-10-23 08:55 编辑
jxyun99 发表于 2022-10-22 21:04
测试了,好使!
但还有点困难就是因为linkPath和targetPath的多个路径分别都写在同一行,文件夹不多的时 ...

那更简单了:(保存批处理和config.txt的时候确认使用ANSI编码选项保存)
  1. @echo off
  2. pushd "%~dp0"

  3. for /f "delims=; tokens=1,2" %%i in (config.txt) do (
  4.         robocopy "%%i" "%%j" /e /copyall /xj
  5.         rmdir "%%i" /s /q
  6.         mklink /j "%%i" "%%j"
  7. )


  8. pause
复制代码
手机上手写的,【仍然强烈建议先小规模测试】!



作者: jxyun99    时间: 2022-10-23 08:54
sunsea 发表于 2022-10-22 22:47
那更简单了:(保存批处理和config.txt的时候确认使用ANSI编码选项保存)
手机上手写的,【仍然强烈建 ...

感谢,解决问题了
作者: cao8mm    时间: 2022-10-23 11:50
不错
作者: sxft1978    时间: 2022-10-23 11:57

作者: zds1210    时间: 2022-10-23 15:56
sunsea 发表于 2022-10-22 20:26
手写的,【强烈建议先小规模测试】!

很好,这个批处理,主要是测试不同系统版本的适应性上。
作者: chiuchiutw    时间: 2022-10-27 15:47
厲害了,大牛們




欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3