Board logo

标题: 高手请帮忙看看这个批处理防删文件夹 [打印本页]

作者: philon     时间: 2008-6-25 00:40    标题: 高手请帮忙看看这个批处理防删文件夹

我希望把这个批处理放到任何一个我需要的目录下,执行批处理后,在该目录下新建一个防删文件夹sm.并把该目录下所有的文件和文件夹复制到这个防删文件夹sm.中。用copy只能复制文件无法复制文件夹。用xcopy该如何处理?请高手指点!内容如下:

@echo off&mode con cols=50 lines=12
title 创建或删除一个私密文件夹
if not exist sm..\nul (
md sm..\
color 5a&cls&echo.&echo 私密文件夹已创建!文件将装入私密文件夹中...&ping/n 2 127.1>nul
echo 正在复制文件...  
copy %CurDir% * sm..\>nul 2>nul
) else (
rd /s/q sm..\
color 5e&cls&echo.&echo 私密文件夹已删除!&ping/n 2 127.1>nul
)
color 5b&cls&echo.&echo 重复执行重新创建或删除!&ping/n 2 127.1>nul
作者: pusofalse     时间: 2008-6-25 00:44
对畸形文件夹不感冒。
爱莫能助。。。帮顶。。。
不过可以利用“文件夹扩展名”把你的东西藏c:\windows\tasks文件夹中 记住一定要用copy命令,否则图形化界面无效。。。
还有浏览器 控制面板  网上邻居 管理工具 回收站 这些地方都是隐藏文件的好地方。。。。
作者: philon     时间: 2008-6-25 01:01
我再非常批处理论坛发了帖子也没人解决,郁闷!!
作者: HAT     时间: 2008-6-25 01:04
xcopy不能向畸形文件夹拷贝东西吧
楼主不会是国家核潜艇训练中心的吧

  Quote:
积分 4
发帖 1
注册 2005-12-23
状态 在线


作者: PPdos     时间: 2008-6-25 01:20
潜水三载而不冒泡乎 奇才奇才!
作者: philon     时间: 2008-6-25 01:21
哈哈哈哈,hat兄弟,见笑了。确实!
作者: jsunhj     时间: 2008-6-25 12:04
不了解,顶一下
作者: wxcute     时间: 2008-6-25 21:45
xcopy 不好这样处理当前目录。
带点目录不在当前目录下会容易点。
作者: yxn064     时间: 2008-6-26 16:14
真是高手能写这么复杂的命令!
作者: philon     时间: 2008-6-27 11:07
还是没人能解决?
作者: amio     时间: 2008-6-27 11:23
直接 建立一个你想复制的文件夹?    然后在把那个文件夹下的所有文件 复制到你刚才建那个文件夹里 ??
作者: wingface     时间: 2008-6-27 11:44
copy %CurDir% * sm6b7e~1>nul 2>nul

别问我为什么,自己用dir /x 看一下就知道了
作者: HAT     时间: 2008-6-27 11:58


  Quote:
Originally posted by wingface at 2008-6-27 11:44 AM:
copy %CurDir% * sm6b7e~1>nul 2>nul

别问我为什么,自己用dir /x 看一下就知道了

Nice job!
作者: moniuming     时间: 2008-6-27 19:18
@echo off
for /l %%a in (1 1 10000) do set "n=%%a"
echo 经过 %n% 次测试,发现 xcopy 和 move 无法对畸形目录进行操作
pause>nul
作者: HAT     时间: 2008-6-27 20:27    标题: to 14楼

用12楼的方法可以用xcopy操作畸形目录
作者: moniuming     时间: 2008-6-27 23:17


  Quote:
Originally posted by wingface at 2008-6-27 11:44:
copy %CurDir% * sm6b7e~1>nul 2>nul

别问我为什么,自己用dir /x 看一下就知道了

厉害,这样的东西都能被发现,佩服
作者: philon     时间: 2008-6-28 16:13


  Quote:
Originally posted by HAT at 2008-6-27 20:27:
用12楼的方法可以用xcopy操作畸形目录

是可以操作,但无论copy还是xcopy都不能把文件夹复制到sm.中!!
郁闷~~
作者: HAT     时间: 2008-6-28 16:18


  Quote:
Originally posted by philon at 2008-6-28 04:13 PM:

是可以操作,但无论copy还是xcopy都不能把文件夹复制到sm.中!!
郁闷~~

我测试过,可以。
把你的xcopy命令贴出来看看。
作者: philon     时间: 2008-6-28 16:21


  Quote:
Originally posted by HAT at 2008-6-28 16:18:

我测试过,可以。
把你的xcopy命令贴出来看看。

hat兄,你看看:
@echo off&mode con cols=50 lines=12
title 创建或删除一个私密文件夹
if not exist sm..\nul (
md sm..\
color 5a&cls&echo.&echo 私密文件夹已创建!文件将装入私密文件夹中...&ping/n 2 127.1>nul
echo 正在复制文件...  
xcopy %CurDir% * sm6b7e~1>nul 2>nul
) else (
rd /s/q sm..\
color 5e&cls&echo.&echo 私密文件夹已删除!&ping/n 2 127.1>nul
)
color 5b&cls&echo.&echo 重复执行重新创建或删除!&ping/n 2 127.1>nul
作者: HAT     时间: 2008-6-28 16:22
多看看xcopy的帮助^_^

  /E           Copies directories and subdirectories, including empty ones.
               Same as /S /E. May be used to modify /T.
作者: philon     时间: 2008-6-28 16:27
xcopy %CurDir% * sm6b7e~1/e>nul 2>nul
xcopy %CurDir% * sm6b7e~1/s/e>nul 2>nul
xcopy %CurDir% * sm6b7e~1/s/e/t>nul 2>nul
以上都不行啊!
作者: HAT     时间: 2008-6-28 16:34
look


作者: philon     时间: 2008-6-28 16:42
当然,指定源文件的绝对路径是可以复制所有文件和文件夹的,但,我要它复制当前目录下的所有文件和文件夹,是不是xcopy对%CurDir%不识别呢?
作者: philon     时间: 2008-6-28 16:51
HAT兄,还在吗?请解答一下。
作者: HAT     时间: 2008-6-28 17:10
sm..\也在当前目录下,你总不能指望把一个文件夹拷贝到它在身里面吧?

Cannot perform a cyclic copy
作者: philon     时间: 2008-6-28 17:20
也是啊,看来我开头提出的那个要求是无法实现了。
作者: philon     时间: 2008-6-28 17:22
其实复制sm..\自身是没有意义的。那有没有可能把除sm..\以外的其他所有文件夹复制到sm..\里呢?
如果能,需要加入哪些语句。还望HAT兄帮忙。

[ Last edited by philon on 2008-6-28 at 05:24 PM ]
作者: HAT     时间: 2008-6-28 17:28
xcopy只支持文件例外,不支持文件夹例外,想其它方法吧。
作者: HAT     时间: 2008-6-28 17:34
加个fox循环排除sm..\,然后再利用xcopy /i,也许可以实现,先吃饭去了,回来再讨论。
作者: fastslz     时间: 2008-6-28 19:03
复制方式.cmd
>test.txt echo.
>"test 1.log" echo.
md "test 文件夹"
copy /y *.txt "test 文件夹"
copy /y *.log "test 文件夹"
cls&@echo 测试文件及文件夹已创建,按任意键继续. . .&pause>nul
@rem 实际应用上面部分去掉

@echo off&rem mode con cols=50 lines=12
setlocal enabledelayedexpansion
set CurDir=%~dp0
title 创建或删除一个私密文件夹
if not exist sm..\nul (
md sm..\
color 5a&cls&echo.&echo 私密文件夹已创建!文件将装入私密文件夹中...&ping/n 2 127.1>nul
echo 正在复制文件...  
for /f "delims=*" %%i in ('dir/a-d/s/b "%CurDir%"^|findstr /i /v "\sm. .bat .cmd"') do (
    set "SourceFile=%%i"
    set "DestinationFile=!SourceFile:%CurDir%=!"
    call :xxx "%CurDir%sm6b7e~1\!DestinationFile!"
    call :xxxx "!SourceFile!" "%CurDir%sm6b7e~1\!DestinationFile!"
)
ping/n 2 127.1>nul
start "" D:\TMP\sm..\
) else (
rd /s/q sm..\
color 5e&cls&echo.&echo 私密文件夹已删除!&ping/n 2 127.1>nul
)
color 5b&cls&echo.&echo 重复执行重新创建或删除!&ping/n 2 127.1>nul
exit

:xxx
md "%~dp1" 2>nul
goto:eof

:xxxx
xcopy /y/h/r "%~1" "%~dp2" >nul
goto:eof
移动方式.cmd
>test.txt echo.
>"test 1.log" echo.
md "test 文件夹"
copy /y *.txt "test 文件夹"
copy /y *.log "test 文件夹"
cls&@echo 测试文件及文件夹已创建,按任意键继续. . .&pause>nul
@rem 实际应用上面部分去掉

@echo off&rem mode con cols=50 lines=12
setlocal enabledelayedexpansion
set CurDir=%~dp0
title 创建或删除一个私密文件夹
if not exist sm..\nul (
md sm..\
color 5a&cls&echo.&echo 私密文件夹已创建!文件将装入私密文件夹中...&ping/n 2 127.1>nul
echo 正在复制文件...  
for /f "delims=*" %%i in ('dir/a-d/s/b "%CurDir%"^|findstr /i /v "\sm. .bat .cmd"') do (
    set "SourceFile=%%i"
    set "DestinationFile=!SourceFile:%CurDir%=!"
    call :xxx "%CurDir%sm6b7e~1\!DestinationFile!"
    move /y "!SourceFile!" "%CurDir%sm6b7e~1\!DestinationFile!"
)
start "" D:\TMP\sm..\
) else (
rd /s/q sm..\
color 5e&cls&echo.&echo 私密文件夹已删除!&ping/n 2 127.1>nul
)
color 5b&cls&echo.&echo 重复执行重新创建或删除!&ping/n 2 127.1>nul
pause

exit
:xxx
md "%~dp1" 2>nul
goto:eof

作者: fastslz     时间: 2008-6-28 19:15
补充
把代码里start "" D:\TMP\sm..\替换成start "" "%CurDir%sm..\"
作者: philon     时间: 2008-6-28 20:04
楼上,我测试了复制.cmd,还是没有把空文件夹复制到sm..\中

[ Last edited by philon on 2008-6-28 at 08:24 PM ]
作者: HAT     时间: 2008-6-28 20:46
用/e也不行?

  /E           Copies directories and subdirectories, including empty ones.
               Same as /S /E. May be used to modify /T.
作者: philon     时间: 2008-6-28 20:49
是的,加了/e后,也没有复制过去,而且出现了不能进行周期性复制的提示,复制过去的只有非空目录和它里面的文件,当前目录下的文件都没有复制过去
作者: fastslz     时间: 2008-6-28 21:00
有必要处理空文件夹吗?
>test.txt echo.
>"test 1.log" echo.
md "test 文件夹"
md "test 文件夹.ddd"
copy /y *.txt "test 文件夹"
copy /y *.log "test 文件夹"
cls&@echo 测试文件及文件夹已创建,按任意键继续. . .&pause>nul
@rem 实际应用上面部分去掉

@echo off&mode con cols=80 lines=12
setlocal enabledelayedexpansion
set CurDir=%~dp0
title 创建或删除一个私密文件夹
if not exist sm..\nul (
md sm..\
color 5a&cls&echo.&echo 私密文件夹已创建!文件将装入私密文件夹中...&ping/n 2 127.1>nul
for /f "delims=*" %%a in ('dir/ad/s/b "%CurDir%"^|findstr /i /v "\sm."') do md "%CurDir%sm6b7e~1\%%~nxa"
for /f "delims=*" %%i in ('dir/a-d/s/b "%CurDir%"^|findstr /i /v "\sm. .bat .cmd"') do (
    set "SourceFile=%%i"
    set "DestinationFile=!SourceFile:%CurDir%=!"
    call :xxxx "!SourceFile!" "%CurDir%sm6b7e~1\!DestinationFile!"
)
ping/n 2 127.1>nul
start "" "%CurDir%sm..\"
) else (
rd /s/q sm..\
color 5e&cls&echo.&echo 私密文件夹已删除!&ping/n 2 127.1>nul
)
color 5b&cls&echo.&echo 重复执行重新创建或删除!&ping/n 2 127.1>nul
exit

:xxxx
cls&echo 正在复制文件 "%~1" ......
xcopy /y/h/r "%~1" "%~dp2" >nul
goto:eof

作者: philon     时间: 2008-6-28 21:22
fastslz
你真是高手,非常感谢!这次好了。达到了我预想的目的!再次感谢~
我把  cls&echo 正在复制文件 "%~1" ......  改成了 cls&echo 正在复制文件 ......
哈哈
作者: xypcmac     时间: 2008-6-28 21:31


  Quote:
Originally posted by HAT at 2008-6-28 17:34:
加个fox循环排除sm..\,然后再利用xcopy /i,也许可以实现,先吃饭去了,回来再讨论。

先把要复制进 “sm.” 文件夹的文件、文件夹复制到其它地方然后再复制回来也一样。
作者: fastslz     时间: 2008-6-28 22:08


  Quote:
Originally posted by philon at 2008-6-28 21:22:

我把  cls&echo 正在复制文件 "%~1" ......  改成了 cls&echo 正在复制文件 ......
哈哈


:xxxx
cls&echo 正在复制文件%status%
xcopy /y/h/r "%~1" "%~dp2" >nul
set status=%status%.
goto:eof

作者: philon     时间: 2008-6-28 22:49
再请教一下,我用您的代码后,不能更改要创建的文件夹名字?sm不能换成别的名字?比如wd或者干脆叫私密文件夹吗?是不是和那个6b7e~1有关啊,它是干吗用的?等待您的答复。
作者: HAT     时间: 2008-6-28 23:40
汗水,你还没有搞清楚sm6b7e~1是怎么来的?
12楼讲的很明白啊,dir /x
作者: xypcmac     时间: 2008-6-28 23:44
看图:



作者: philon     时间: 2008-6-28 23:48
是啊,就是没法把sm改成别的名字。
作者: fastslz     时间: 2008-6-28 23:52

@echo off&mode con cols=70 lines=12
setlocal enabledelayedexpansion
set CurDir=%~dp0
color 5b&cls&echo.
set /p Name=输入一个文件夹名!不支持带空格文件夹名  
if not defined Name color 0c&cls&echo.&echo 你没有输入任何字符!&&ping/n 3 127.1>nul&exit
title 创建或删除一个私密文件夹
if not exist %Name%..\nul (
        md "%Name%..\"
        for /f "skip=1 tokens=4*" %%a in ('dir/ad/x "%CurDir%%Name%.*"') do if not defined ShortName set "ShortName=%%a"
        color 5a&cls&echo.&echo 私密文件夹已创建!文件将装入私密文件夹中...&ping/n 2 127.1>nul
        for /f "delims=*" %%a in ('dir/ad/s/b "%CurDir%"^|findstr /i /v "\%Name%."') do md "%CurDir%!ShortName!\%%~nxa"
        for /f "delims=*" %%i in ('dir/a-d/s/b "%CurDir%"^|findstr /i /v "\%Name%. .bat .cmd"') do (
            set "SourceFile=%%i"
            set "DestinationFile=!SourceFile:%CurDir%=!"
            call :xxxx "!SourceFile!" "%CurDir%!ShortName!\!DestinationFile!"
        )
        ping/n 2 127.1>nul
        start "" "%CurDir%%Name%..\"
) else (
        rd /s/q "%Name%..\"
        color 5e&cls&echo.&echo 私密文件夹已删除!&ping/n 2 127.1>nul
)
color 5b&cls&echo.&echo 重复执行重新创建或删除!&ping/n 2 127.1>nul
exit

:xxxx
if not defined count set count=0
if %count% gtr 50 set status=.&set count=1
cls&echo 正在复制文件%status%..
xcopy /y/h/r "%~1" "%~dp2" >nul
set status=%status%.&set /a count+=1
goto:eof
当Name变量没有定义或定义为空格字符时 rd /s/q %Name%..\将执行删除父目录里所有文件夹,任何损失和本人无关,所以请不要随便更改代码
作者: quya     时间: 2008-6-28 23:53
其实这种文件夹也好删除的, 称不上私密文件夹。

因为就像12楼说的, dir/x 什么都出来了。

比如 md g..\  其实就可以 cd ge276~1, 然后随便你怎么搞了。道理和 sm6b7e~1一样
作者: philon     时间: 2008-6-29 01:15
感谢hat兄,感谢fastslz兄,感谢12楼的朋友。
我终于做成了我需要的p文件。我的p文件为:防删文件夹.bat
要创建的文件夹叫:私密文件夹..\
把当前目录下除防删文件夹.bat和私密文件夹..\以外的所有文件、文件夹复制到私密文件夹..\中。我修改了fastslz兄的代码如下:
@echo off&mode con cols=80 lines=12
setlocal enabledelayedexpansion
set CurDir=%~dp0
title 创建或删除一个私密文件夹
if not exist 私密文件夹..\nul (
md 私密文件夹..\
color 5a&cls&echo.&echo 私密文件夹已创建!当前目录下的所有内容将被拷贝到私密文

件夹中...&ping/n 2 127.1>nul
for /f "delims=*" %%a in ('dir/ad/s/b "%CurDir%"^|findstr /i /v "\私密文件

夹."') do md "%CurDir%私密文~1\%%~nxa"
for /f "delims=*" %%i in ('dir/a-d/s/b "%CurDir%"^|findstr /i /v "\防删文件

夹."') do (
    set "SourceFile=%%i"
    set "DestinationFile=!SourceFile:%CurDir%=!"
    call :xxxx "!SourceFile!" "%CurDir%私密文~1\!DestinationFile!"
)
ping/n 2 127.1>nul
start "" "%CurDir%私密文件夹..\"
) else (
rd /s/q 私密文件夹..\
color 5e&cls&echo.&echo 私密文件夹已删除!&ping/n 2 127.1>nul
)
color 5b&cls&echo.&echo 重复执行重新创建或删除!&ping/n 3 127.1>nul
exit

:xxxx
cls&echo 正在复制文件%status%
xcopy /y/h/r "%~1" "%~dp2" >nul
set status=%status%.
goto:eof
注,虽然没什么大的用处,但使我学习了一些东西,再次感谢几位热心的朋友!
作者: seuseuseu     时间: 2008-9-8 14:12
顶起来
作者: shaokui123     时间: 2010-4-12 10:24
高手,相当厉害啊!!!
请教一下,代码能修改成复制完毕后把被复制的文件立即删除吗
还有能加上指定路径的功能吗?