找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 74235|回复: 22

[文件操作] 批处理怎样遍历并且删除每个用户文件夹下指定格式文件?

[复制链接]
发表于 2012-2-16 22:06:37 | 显示全部楼层 |阅读模式
大家好, 小弟学艺不精.. 有如下需求请大侠帮忙.

需求: 在多用户登录的电脑上, 能删除Win7每个用户文件夹下的缓存文件.  以下是我写的代码, 遇到错误, 请大家指正. 谢谢

#1, 脚本需要遍历 C:\users\   
#2, 判断 C:\Users\xxxx\AppData\Local\Microsoft\outlook\ 文件夹下是否存在 outlook.ost 和 *.pst文件.
#3, 如果存在, 并且删除掉.
#4, 再循环 判断和删除下一个用户文件夹的 邮件缓存文件.
#5, 对删除成功的文件记录到文本日志文件.
  1. @echo off

  2. ::枚举用户文件夹名字写入list.txt
  3. dir /ad /b c:\users > list.txt

  4. Set RootFolder = C:\Users\
  5. Set SubFolder = \AppData\Local\Microsoft\Outlook\

  6. echo %RootFolder%
  7. echo %SubFolder%

  8. ::读取list.txt 连接成绝对路径
  9. for /f %%i in (list.txt) do (
  10. echo %RootFolder% & %%i &  %SubFolder%

  11. :: 连接成为绝对路径, (路径显示不正确.)
  12. Set MyPath = %RootFolder% & %%i & %SubFolder%

  13. ::判断路径是否存在, 如果存在就做删除操作.
  14. if exist %MyPth% (del /s /f %MyPath%outlook.ost)

  15. )
  16. PAUSE
复制代码
运行结果:

ECHO is off.
ECHO is off.
The syntax of the command is incorrect.
发表于 2012-2-16 22:08:25 | 显示全部楼层
把等号两边的空格全部删掉
 楼主| 发表于 2012-2-16 23:00:36 | 显示全部楼层
回复 2# find


    谢谢Find..   但是执行结果还是不对.  可能是路径连接的地方有问题. 我把变量 这样写echo %RootFolder%&%%i&%SubFolder%, 还是不对... 请指教

list.txt 文件内容是:
All Users
Default
Default User
admin
Public

命令行执行结果如下:

C:\Users\
\AppData\Local\Microsoft\Outlook\
C:\Users\
'All' is not recognized as an internal or external command,operable program or batch file.
'\AppData\Local\Microsoft\Outlook\' is not recognized as an internal or external command,operable program or batch file.
'All' is not recognized as an internal or external command,operable program or batch file.
'\AppData\Local\Microsoft\Outlook\' is not recognized as an internal or external command,operable program or batch file.
C:\Users\
'Default' is not recognized as an internal or external command,operable program or batch file.
'\AppData\Local\Microsoft\Outlook\' is not recognized as an internal or external command,operable program or batch file.
'Default' is not recognized as an internal or external command,operable program or batch file.
'\AppData\Local\Microsoft\Outlook\' is not recognized as an internal or external command,operable program or batch file.
C:\Users\
'Default' is not recognized as an internal or external command,operable program or batch file.
'\AppData\Local\Microsoft\Outlook\' is not recognized as an internal or external command,operable program or batch file.
'Default' is not recognized as an internal or external command,operable program or batch file.
'\AppData\Local\Microsoft\Outlook\' is not recognized as an internal or external command,operable program or batch file.
C:\Users\
'admin' is not recognized as an internal or external command,operable program or batch file.
'\AppData\Local\Microsoft\Outlook\' is not recognized as an internal or external command,operable program or batch file.
C:\Users\
'Public' is not recognized as an internal or external command,operable program or batch file.
'\AppData\Local\Microsoft\Outlook\' is not recognized as an internal or external command,operable program or batch file.
'Public' is not recognized as an internal or external command,operable program or batch file.
'\AppData\Local\Microsoft\Outlook\' is not recognized as an internal or external command,operable program or batch file.
发表于 2012-2-16 23:21:09 | 显示全部楼层
回复 3# ppappa2001


连接的时候不需要使用&符号
 楼主| 发表于 2012-2-16 23:26:15 | 显示全部楼层
本帖最后由 ppappa2001 于 2012-2-16 23:30 编辑

去掉过后, 路径对了..


但是在判断文件是否存在时候,  删除动作没执行. 也没报错..

C:\Users\
\AppData\Local\Microsoft\Outlook\
C:\Users\All\AppData\Local\Microsoft\Outlook\
C:\Users\Default\AppData\Local\Microsoft\Outlook\
C:\Users\Default\AppData\Local\Microsoft\Outlook\
C:\Users\admin\AppData\Local\Microsoft\Outlook\
C:\Users\Public\AppData\Local\Microsoft\Outlook\

修改以后的代码如下:
  1. @echo off

  2. ::枚举用户文件夹名字写入list.txt
  3. dir /ad /b c:\users > list.txt

  4. Set RootFolder=C:\Users\
  5. Set SubFolder=\AppData\Local\Microsoft\Outlook\

  6. echo %RootFolder%
  7. echo %SubFolder%

  8. ::读取list.txt 连接成绝对路径
  9. for /f %%i in (list.txt) do (
  10. echo %RootFolder%%%i%SubFolder%

  11. :: 连接成为绝对路径, (路径显示不正确.)
  12. Set MyPath = %RootFolder%%%i%SubFolder%

  13. ::判断路径是否存在, 如果存在就做删除操作.
  14. if exist %MyPth% (del /s /f %MyPath%outlook.ost)

  15. )



  16. PAUSE
复制代码
发表于 2012-2-16 23:41:22 | 显示全部楼层
回复 5# ppappa2001


等号两边的空格还没有删完
 楼主| 发表于 2012-2-16 23:43:06 | 显示全部楼层
回复 6# find

重新改过了.

  1.     @echo off

  2. ::枚举用户文件夹名字写入list.txt
  3. dir /ad /b c:\users > list.txt

  4. Set RootFolder=C:\Users\
  5. Set SubFolder=\AppData\Local\Microsoft\Outlook\

  6. echo %RootFolder%
  7. echo %SubFolder%

  8. ::读取list.txt 连接成绝对路径
  9. for /f %%i in (list.txt) do (
  10. echo %RootFolder%%%i%SubFolder%

  11. :: 连接成为绝对路径, (路径正确如: C:\Users\Default\AppData\Local\Microsoft\Outlook\)
  12. Set MyPath=%RootFolder%%%i%SubFolder%

  13. echo %MyPath%outlook.ost
  14. echo ..
  15. ::判断路径是否存在, 如果存在就做删除操作.
  16. if exist %MyPath%outlook.ost (del /s /f %MyPath%outlook.ost)
复制代码
结果:

C:\Users\
\AppData\Local\Microsoft\Outlook\
C:\Users\All\AppData\Local\Microsoft\Outlook\
C:\Users\Public\AppData\Local\Microsoft\Outlook\outlook.ost
..
C:\Users\Default\AppData\Local\Microsoft\Outlook\
C:\Users\Public\AppData\Local\Microsoft\Outlook\outlook.ost
..
C:\Users\Default\AppData\Local\Microsoft\Outlook\
C:\Users\Public\AppData\Local\Microsoft\Outlook\outlook.ost
..
C:\Users\admin\AppData\Local\Microsoft\Outlook\
C:\Users\Public\AppData\Local\Microsoft\Outlook\outlook.ost
..
C:\Users\Public\AppData\Local\Microsoft\Outlook\
C:\Users\Public\AppData\Local\Microsoft\Outlook\outlook.ost
 楼主| 发表于 2012-2-16 23:44:20 | 显示全部楼层
文件还是没删掉....
 楼主| 发表于 2012-2-16 23:45:28 | 显示全部楼层
而且很纳闷, 为啥第19行输出的 都变成了 Public

C:\Users\Public\AppData\Local\Microsoft\Outlook\outlook.ost
发表于 2012-2-16 23:46:43 | 显示全部楼层
回复 7# ppappa2001


for /f "delims=" %%i in (list.txt) do (
 楼主| 发表于 2012-2-16 23:49:19 | 显示全部楼层
改了还是一样的结果喃?
发表于 2012-2-16 23:51:34 | 显示全部楼层
  1. @echo off
  2. set RootFolder=C:\Users
  3. set SubFolder=AppData\Local\Microsoft\Outlook
  4. for /f "delims=" %%i in ('dir /ad /b C:\users') do (
  5.     echo %RootFolder%\%%i\%SubFolder%\outlook.ost
  6.     if exist "%RootFolder%\%%i\%SubFolder%\outlook.ost" (
  7.         del /f /q "%RootFolder%\%%i\%SubFolder%\outlook.ost"
  8.     )
  9. )
复制代码

评分

参与人数 1技术 +1 收起 理由
ppappa2001 + 1 完美

查看全部评分

 楼主| 发表于 2012-2-16 23:56:08 | 显示全部楼层
完美   多谢find
 楼主| 发表于 2012-2-17 00:00:51 | 显示全部楼层
本帖最后由 ppappa2001 于 2012-2-17 00:12 编辑

回复 12# find

我把文件名字改成了通配符格式.
  1. @echo off

  2. set RootFolder=C:\Users

  3. set SubFolder=AppData\Local\Microsoft\Outlook

  4. for /f "delims=" %%i in ('dir /ad /b C:\users') do (
  5. REM  echo %RootFolder%\%%i\%SubFolder%\*.ost

  6.     if exist "%RootFolder%\%%i\%SubFolder%\*.ost" (
  7.         dir /b %RootFolder%\%%i\%SubFolder%\*.ost>>Delete.log
  8.         del /f /q "%RootFolder%\%%i\%SubFolder%\*.ost"

  9.     )
  10. )
复制代码
能不能在第12行的 删除操作之前, 把删除的文件路径写入日志文件喃?

我增加了删除之前枚举文件的命令. 如果删除成功, 那么删掉的文件就是被枚举的文件. 但是如果进程被占用, 那么文件并没有被删除, 而文件名还是被写入日志, 就不符合实际..  有啥办法只把删掉的文件写入日志..??
发表于 2012-2-17 01:03:41 | 显示全部楼层
你的思路本来就有问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 18:27 , Processed in 0.019192 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表