Board logo

标题: [文件操作] 【已解决】如何将指定目录下的文件及文件夹按原有目录结构复制到别的目录里 [打印本页]

作者: 228630386    时间: 2015-8-8 07:38     标题: 【已解决】如何将指定目录下的文件及文件夹按原有目录结构复制到别的目录里

本帖最后由 pcl_test 于 2017-4-23 23:54 编辑

批处理是否可以命令将指定文件复制,并生成链接?
假如是 E:\备分数据\【PPT】王老吉 123 完成图,文件夹中还有子文件和内容,
能否实现将【PPT】王老吉 123 完成图文件下的所有内容复制到指定的位置:如S:\提交成品\,这个路径中,并自动生成链接
即S:\提交成品\【PPT】王老吉 123 完成图,并带有此连接的复制功能,可以在QQ之类直接发出来?

假如是  E:\备分数据\【PPT】王老吉 123 完成图\目录-1,即需要生成的链接是S:\提交成品\【PPT】王老吉 123 完成图\目录-1

E盘中的文件夹名不固定,只有S:\提交成品\是固定,需要拷贝的链接有两个可能,一级目录和二级目录。
作者: 回家路上    时间: 2015-8-8 10:01

根据我对这需求的理解,难道是把文件夹复制到新的位置,然后复制一下新的路径。
不是吧,如果是的话,似乎没批处理的必要吧?
  1. @echo off
  2. md "E:\备分数据\【PPT】王老吉 123 完成图"
  3. xcopy /e /y "E:\备分数据\【PPT】王老吉 123 完成图" "S:\提交成品\【PPT】王老吉 123 完成图"
  4. echo;S:\提交成品\【PPT】王老吉 123 完成图 123 完成图|clip
复制代码

作者: 228630386    时间: 2015-8-8 10:09

回复 2# 回家路上


    嗯,差不多就是这个意思,就是要把当前文件夹内容复制到服务器中,因为要发出链接,通知别人这是已完成的链接,但每天重复做这样的工作好多次。
  如果成可直接运行命令能把当前文件夹的内容直接拷上去并生成链接的话,哪就不用每次都要打开哪文件夹去复制链接。
作者: 回家路上    时间: 2015-8-8 11:13

回复 3# 228630386


哦。明白了。
批处理放到【PPT】王老吉 123 完成图这样的要复制的文件夹下,执行
  1. @echo off
  2. set "dirpath=%~dp0"
  3. for /f "delims=" %%i in ("%dirpath:~0,-1%") do set 当前目录名=%%~ni
  4. md "S:\提交成品\%当前目录名%" >nul 2>&1
  5. xcopy /e /y "%dirpath:~0,-1%" "S:\提交成品\%当前目录名%"
  6. del /q "S:\提交成品\%当前目录名%\%~nx0"
  7. echo;S:\提交成品\%当前目录名%|clip
  8. echo;完成:
  9. echo; 1)复制文件
  10. echo; 1)将目标路径复制到了剪贴板
  11. pause & exit /b
复制代码

作者: 228630386    时间: 2015-8-8 11:37

回复 4# 回家路上


    太强大了,但可否再多加一项就是如果还有一个下级目录的话,也能提取到名称么?
    因为有时候是一级目录下有多个子文件夹,有时候是二级目录下有好多个子文件夹,能否两个都同时做到呢?就是命令能否检测到?
    E:\备分数据\【PPT】王老吉 123 完成图
    复制出来的链接可以是 F:\提交成品\【PPT】王老吉 123 完成图

    E:\备分数据\【PPT】王老吉 123 完成图\目录-1
    复制出来的链接可以是 F:\提交成品\【PPT】王老吉 123 完成图\目录-1
作者: 228630386    时间: 2015-8-8 13:38

回复 4# 回家路上


    是否这种二目录链接提取是不可以实现呢?
作者: 回家路上    时间: 2015-8-8 15:34

本帖最后由 回家路上 于 2015-8-8 15:41 编辑

回复 6# 228630386


哦,刚看到,哈哈,主要我也碰到个问题,没注意
这个当然也能实现只要改前面一点就行了
  1. @echo off
  2. set "dirpath=%~dp0"
  3. set "des=S:\提交成品\"
  4. set 当前目录名=%dirpath:*备份数据\=%
  5. set 当前目录名=%当前目录名:~0,-1%
  6. md "%des%%当前目录名%" >nul 2>&1
  7. xcopy /e /y "%dirpath:~0,-1%" "%des%%当前目录名%"
  8. del /q "%des%%当前目录名%\%~nx0"
  9. echo;%des%%当前目录名%|clip
  10. pause & exit /b
复制代码
我也是初学这个,写的不好哈

要复制那个目录就放在那个目录下运行
作者: 228630386    时间: 2015-8-8 15:47

本帖最后由 228630386 于 2015-8-8 15:57 编辑

回复 7# 回家路上


    这个运行时出错了,不知是什么原因呢?
    假如E盘哪个文件夹不是叫备份数据可以么?能否改成什么文件名都能通用?
作者: 回家路上    时间: 2015-8-8 16:22

回复 8# 228630386


什么错误?
这种根目录名字是不定的,层数估计也是不定的,要复制的目录相对位置也是不定的,我就不会了。
坐等逻辑能力比较强的人吧。
作者: 228630386    时间: 2015-8-8 16:38

回复 9# 回家路上


   命令可以运行了,真心非常感谢,但拷贝出来的链接也是没有显示子目录。即目录-1
 不过能做到这一步已经可以让我们工作起来方便很多了,如果可以实现一下在E盘中的文件名无论是什么文件名都能执行就更好
   因为每个人的路径都不一样,请问还有其它大神能帮帮忙么?
作者: pcl_test    时间: 2015-8-8 18:42

回复 10# 228630386

不确定的因数太多,并不能很好的区分你所说的一级和二级目录,所以要无误的区分,最好就是指定目录,或者有规律可循
作者: 228630386    时间: 2015-8-8 19:18

回复 11# pcl_test


    我QQ找你了,你应该是没上QQ,哪只有区分成二种方法去做。一级目录已经解决了,哪指定这样的二级目录和命令能实现么用命令去操作么?
 假如是  E:\备分数据\【PPT】王老吉 123 完成图\目录-1,即需要生成的链接是S:\提交成品\【PPT】王老吉 123 完成图\目录-1
作者: pcl_test    时间: 2015-8-8 20:01

本帖最后由 pcl_test 于 2015-8-8 20:11 编辑

回复 12# 228630386
放进目录-1里运行
  1. @echo off & setlocal enabledelayedexpansion
  2. set "fd=F:\提交成品"
  3. if not exist "%fd%" md "%fd%"
  4. pushd ..
  5. for /f "delims=" %%i in ("%cd%") do set "td1=%%~nxi"
  6. popd
  7. for /f "delims=" %%j in ("%cd%") do set "td2=%%~nxj"
  8. for /d %%a in (*) do xcopy "%%a" "%fd%\%td1%\%td2%\%%a\" /s /y
  9. ::win7及以上系统才有clip
  10. echo;%fd%\%td1%\%td2%|clip
  11. echo;目标路径已复制到剪贴板,按Ctrl+V即可粘贴&ping -n 2 0 >nul
复制代码

作者: 228630386    时间: 2015-8-8 20:16

回复 13# pcl_test


    F:\提交成品\【PPT】王老吉 123 完成图\001 - 副本 (9)
    测试了一下,但复制出来的链接是等于这个,并非目录-1,难道没有办法能解决?
作者: pcl_test    时间: 2015-8-8 20:18

回复 14# 228630386

测试没有问题,是否放进目录-1里运行?核对下代码
作者: 228630386    时间: 2015-8-8 20:27

回复 15# pcl_test


    可以了,应该是我刚才拷贝命令的时候拷错了。非常感谢大家,再加上你上次帮我弄的批处理添加标记,整理流程连在一起工作起来真的方便很多。
  目前一级和二级目录只能分开两个命令去处理,这样也方便不小了。
作者: 回家路上    时间: 2015-8-8 20:33

回复 16# 228630386


看高手写的代码就是好,有层次感,逻辑清楚。

哦,目录X是一定有了呀。我当时就在想嘛
目录有和没有怎么判定
有的话到底可能同时有几个
        如果有多个
                拷贝几个
                        拷贝一个的话拷贝那种条件的
                        拷贝多个的话哪个的路径复制到剪贴板

你的目录结构是这样的,                               
        根目录名称不定
                  |
                  |__要拷贝目录名称不定
                                        |
                                        |_____目录N
所有都是不定的,就没法判定目录N是不是存在了

要判定的话就得给个定的条件任意给以下一个条件:
        1)根目录名称
        2)根目录上级名称
        3)目录N名称或者命名规则
        目录N到底可能同时有几个
                如果有多个
                        拷贝几个
                                拷贝一个的话拷贝【哪种条件】的
                                拷贝多个的话哪个的路径复制到剪贴板
作者: 228630386    时间: 2015-8-8 22:17

回复 17# 回家路上
  
 经你这么分析,他们的确有一些规律,就这命名中的中括号有区别:
  如果是一级目录通常用【】开始命名,全角中括号中会有英文:如【ppt】批处理之家
  
  如果是二级目录通常用 [] 开始命名,下级目录是用【】开始命名,半角中括号中会有英文:如 [ppt]批处理之家\【PPT】批处理之家-1

  然后目录N的文件命名通常是数字+一个空格或者两个空格+数字或者英文:如1 692112156, 8 692546122156
作者: pcl_test    时间: 2015-8-8 22:44

本帖最后由 pcl_test 于 2015-8-8 23:28 编辑

回复 18# 228630386
如果目录中方括号是有此规律,那么可以区分的
  1. @echo off
  2. (echo;%cd%|findstr "\[[^\]]*\][^\\]*\\【[^】]*】") >nul&&echo;当前二级||echo;当前一级
  3. pause
复制代码

作者: 228630386    时间: 2015-8-8 22:51

回复 19# pcl_test
   
但要跟你之前给我的命令放在一起要怎么改呢?还是要大神帮忙,感激不尽!!!
@echo off & setlocal enabledelayedexpansion
set "fd=F:\提交成品"
if not exist "%fd%" md "%fd%"
pushd ..
for /f "delims=" %%i in ("%cd%") do set "td1=%%~nxi"
popd
for /f "delims=" %%j in ("%cd%") do set "td2=%%~nxj"
for /d %%a in (*) do xcopy "%%a" "%fd%\%td1%\%td2%\%%a\" /s /y
::win7及以上系统才有clip
echo;%fd%\%td1%\%td2%|clip
echo;目标路径已复制到剪贴板,按Ctrl+V即可粘贴&ping -n 2 0 >nul
作者: pcl_test    时间: 2015-8-8 23:14

本帖最后由 pcl_test 于 2015-8-9 10:58 编辑

回复 20# 228630386
  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ("%cd%") do set "td=%%~nxi"&set "t=%%~dpi"
  3. (echo;%cd%|findstr "\[[^\[\]]*\][^\\]*\\【[^【】]*】") >nul&&(
  4.     for /f "delims=" %%j in ("!t:~,-1!") do set "td=%%~nxj\%td%"
  5. )
  6. set "fd=F:\提交成品"
  7. if not exist "%fd%" md "%fd%"
  8. for /d %%a in (*) do xcopy "%%a" "%fd%\%td%\%%a\" /s /y
  9. ::win7及以上系统才有clip
  10. echo;%fd%\%td%|clip
  11. echo;目标路径已复制到剪贴板,按Ctrl+V即可粘贴&ping -n 2 0 >nul
复制代码

作者: 回家路上    时间: 2015-8-9 00:35

回复 20# 228630386


高手都到这儿了,必须学习O(∩_∩)O~
放在第一级目录下(不管有没有二级目录)
  1. @echo off
  2. set "fd=F:\提交成品\"
  3. for /f "delims=" %%i in ('dir /ad /b^|findstr "【[^^【】]*】"') do set chd=\%%i
  4. set dd=%~dp0
  5. for /f "delims=" %%i in ("%dd:~0,-1%") do (
  6. set rootd=%%~dpi
  7. set td=%%~ni%chd%
  8. )
  9. if not exist "%fd%%td%" md "%fd%%td%"
  10. xcopy /e /y "%rootd%%td%" "%fd%%td%"
  11. echo;%fd%%td%|clip
  12. echo;目标路径已复制到剪贴板,按Ctrl+V即可粘贴&ping -n 2 0 >nul
  13. pause & exit /b
复制代码

作者: 228630386    时间: 2015-8-9 09:18

回复 21# pcl_test
回复 22# 回家路上

真心感谢两位大侠,完美的解决了这个问题,因为我提出问题时没想到这么多的细节,让你们费心了!!!




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2