jxyun99 发表于 2022-10-22 20:11:09

批处理代码优化

有段代码,目的是把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:15

本帖最后由 sunsea 于 2022-10-22 20:32 编辑

@echo off
setlocal ENABLEDELAYEDEXPANSION

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


:cmdsb
for /f "delims=; tokens=1,*" %%i in ("!linkPath!") do (
      for /f "delims=; tokens=1,*" %%I in ("!targetPath!") do (
                rem 务必看清楚了下面的i、I、j、J!
                robocopy "%%i" "%%I" /e /copyall /xj
                rmdir "%%i" /s /q
                mklink /j "%%i" "%%I"
                set linkPath=%%j
                set targetPath=%%J
      )
)
if not "!linkPath!"=="" goto :cmdsb

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

pause手写的,【强烈建议先小规模测试】!


DOSforever 发表于 2022-10-22 20:31:11

jxyun99 发表于 2022-10-22 20:39:10

sunsea 发表于 2022-10-22 20:26
手写的,【强烈建议先小规模测试】!

感谢,试试先

jxyun99 发表于 2022-10-22 20:39:30

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:02

jxyun99 发表于 2022-10-22 20:54:03

DOSforever 发表于 2022-10-22 20:48
你原来的语句中 mklink 似乎把 target 和 link name 两个参数位置弄反了。

没反吧,要做软链接的文件夹在C盘,要把C盘的那几个文件夹转移到K盘,源语句测试是没问题的,目的就是给C盘减肥,当初很多软件都安装在C盘,又不想重装软件,这样做目录链接后,C盘就可以减很多肥了

jxyun99 发表于 2022-10-22 21:04:34

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:47

magicgenius 发表于 2022-10-22 21:51:57

这样的比较直观,方便增减。

@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:02

本帖最后由 sunsea 于 2022-10-23 08:55 编辑

jxyun99 发表于 2022-10-22 21:04
测试了,好使!
但还有点困难就是因为linkPath和targetPath的多个路径分别都写在同一行,文件夹不多的时 ...
那更简单了:(保存批处理和config.txt的时候确认使用ANSI编码选项保存)
@echo off
pushd "%~dp0"

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


pause手机上手写的,【仍然强烈建议先小规模测试】!


jxyun99 发表于 2022-10-23 08:54:53

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

感谢,解决问题了

cao8mm 发表于 2022-10-23 11:50:51

不错

sxft1978 发表于 2022-10-23 11:57:13

{:1_186:}

zds1210 发表于 2022-10-23 15:56:15

sunsea 发表于 2022-10-22 20:26
手写的,【强烈建议先小规模测试】!

很好,这个批处理,主要是测试不同系统版本的适应性上。

chiuchiutw 发表于 2022-10-27 15:47:39

厲害了,大牛們
页: [1]
查看完整版本: 批处理代码优化