Board logo

标题: 【练习-073】批处理模拟XCOPY批量复制文本文件 [打印本页]

作者: batman    时间: 2013-11-5 21:18     标题: 【练习-073】批处理模拟XCOPY批量复制文本文件

本帖最后由 batman 于 2013-11-5 23:36 编辑

出题目的:
    1、考查大家的文本文件处理能力
    2、活跃大家的批处理思维
加分原则:
    1、成功完成PB+20
    2、出色完成PB+40
    3、思路独特PB另+20~40
    4、公认绝妙方案和代码PB+100技术+1
题目如下:
    现有文件夹D:\MY FOLDER,内有文件夹及子文件夹层数和数目均末知,每个文件夹下有或没有文本文件数目也末知,
现在要求通过批处理将MY FOLDER文件夹及其下所有的文件夹(包含空文件夹)及文件都复制到F:\BACK下,除了目录名为
bathome的文件夹以及后缀名为.org的文件。要求不能使用xcopy、copy命令及其他类似的第三方命令行工具,同时请考虑
所有文本文件要原样被复制出来,不要求考虑编码问题。
作者: foxJL    时间: 2013-11-5 23:00

本帖最后由 foxJL 于 2013-11-7 22:36 编辑

更新了,交作业
  1. @echo off
  2. for /f "delims=" %%i in ('dir /s /b "d:\MY FOLDER\"^|find /v "\bathome\"') do (
  3.     if exist "%%i\" (if /i not "%%~ni"=="bathome" md "f:\back%%~pni") else (
  4.     if /i not "%%~xi"==".org" type "%%i" >"f:\back%%~pnxi")
  5. )
复制代码

作者: Demon    时间: 2013-11-6 00:39

满屏幕的PowerShell,我还以为这里变成PowerShell论坛了。

其实这个练习跟文本处理关系不大,先围观一下。
作者: batman    时间: 2013-11-6 08:29

本帖最后由 batman 于 2013-11-6 08:31 编辑

回复 3# Demon


    纯文本处理的方法也不是不行的。。。
   从本题开始,拟将陆续推出模拟基础命令功能的批处理练习
作者: xxpinqz    时间: 2013-11-6 11:23

本帖最后由 xxpinqz 于 2013-11-6 22:51 编辑

第一个要求还真没注意。。。
  1. @echo off&setlocal enabledelayedexpansion
  2. set "src=d:\MY FOLDER"
  3. (for /f "delims=" %%a in ('dir /s /b "%src%"') do (
  4.     set "str=%%a"
  5.     set "str=!str:%src%=F:\BACK\MY FOLDER!"
  6.     if exist "%%a\" (
  7.         set "str=!str!\"         
  8.         if "!str:\bathome\=!"=="!str!" md "!str!"
  9.     ) else (
  10.         if /I not "%%~xa"==".bat" type "%%a" >"!str!"
  11.     )
  12. ))2>nul
复制代码
改至2楼代码。。。。。。
作者: foxJL    时间: 2013-11-6 11:43

回复 5# xxpinqz


学习学习!
很巧妙的解决了空目录
作者: batman    时间: 2013-11-6 22:16

2楼和5楼共同犯的两个错误:
1、题意是要把MY FOLDER文件夹也复制过去,你们全没理解?
2、你们的判断bathome目录名的方法会将含bathome字符串的路径也排除了。
同时,2楼代码使用了两次遍历,效率被大大降低
所以,暂不给分,请修改完善自己的代码哦。。。
作者: terse    时间: 2013-11-7 02:46

本帖最后由 terse 于 2013-11-7 16:45 编辑

也想不出好办法来  想到再补上
  1. @echo off
  2. set "src=D:\my folder"
  3. set "find=findstr /ivc:"\\bathome\\" |findstr /ivec:"\\bathome" |findstr /ivec:".org""
  4. setlocal enabledelayedexpansion
  5. for /f "delims=" %%i in ('dir /s /b "%src%"^|!find!') do (
  6.     set "str=%%i"
  7.     if exist "%%i\" (
  8.        md "!str:%src%=F:\back\my folder!"
  9.     ) else >"!str:%src%=F:\back\my folder!" type "%%i"
  10. )
  11. pause
复制代码

作者: batman    时间: 2013-11-7 18:46

回复 8# terse


    我等你的好思路。。。
作者: terse    时间: 2013-11-7 19:25

目测 2楼么有排除bathome文件夹吧
作者: foxJL    时间: 2013-11-7 19:56

回复 10# terse


    有啊,这句if /i not "%%~ni"=="bathome"
作者: terse    时间: 2013-11-7 20:02

回复 11# foxJL

这个是创建文件夹的判断最后的
如中间存在还是会忽略的
作者: foxJL    时间: 2013-11-7 21:05

回复 12# terse

好像是哦,没有考虑周全.感谢提醒!




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