标题: 请教各位高手,这样的怎么实现?
[打印本页]
作者: chkau
时间: 2007-4-18 16:32
标题: 请教各位高手,这样的怎么实现?
我现在有D,E两个分区,E盘里有个文件夹,我想在D盘下写一个批处理,运行后自动对比D盘的剩余空间和E盘那个文件夹大小,如果D盘剩余空间大于E盘那个文件夹1G,就自动执行1.BAT,否则就自动删除掉D盘上访问时间最早的1个文件夹,再对比,如果空间还不够就再删1个访问时间最早的文件夹,直到D盘剩余空间大于E盘那个文件夹1G为止,然后自动执行1.BAT
请问各位大大,这个命令怎么写啊?
作者: chkau
时间: 2007-4-18 16:35
我语言表达能力不好.....这篇字看的我自己头都晕了,整理一下,是这个意思
我需要从我的E盘复制某文件夹到本地D盘根目录,前提是复制完后D盘剩余空间不小于1GB,如果剩余空间不足无法复制则依次删除D盘下访问时间最早的文件夹,直到能够复制目标文件夹为止...
大概就是这样,不知道批处理如何实现
作者: chkau
时间: 2007-4-19 02:03
@echo off
for /f "tokens=2 delims=录可" %%i in ('dir /ad /-c d:\') do @echo %%i >free.txt
for /f "tokens=2 delims=件" %%b in ('dir /ad /-c e:\1') do @echo %%b>1.txt
for /f "tokens=1 delims= " %%a in (1.txt) do @echo %%a >lose.txt
@del 1.txt
这样做了我就分别提取了D盘的剩余空间和E盘的1文件夹的大小,但是接下来怎么把这两个数字进行对比?
作者: bjsh
时间: 2007-4-19 02:47
[
Last edited by bjsh on 2007-4-18 at 01:50 PM ]
作者: zhoushijay
时间: 2007-4-19 03:15
吃好饭再来解决 ^^
作者: chkau
时间: 2007-4-19 03:39
发现一个问题,在DOS下dir文件夹只能查看到该文件夹所含文件的总大小,看不到文件夹总大小,有什么方法解决吗?
作者: bowman
时间: 2007-4-19 06:08
Quote: |
Originally posted by chkau at 2007-4-18 02:39 PM:
发现一个问题,在DOS下dir文件夹只能查看到该文件夹所含文件的总大小,看不到文件夹总大小,有什么方法解决吗? |
|
dir dirpath /a/s/-c
倒数第2行显示文件夹大小
作者: zhoushijay
时间: 2007-4-19 06:18
dim q,fn,frD
Set q = CreateObject("Scripting.FileSystemObject")
set fn=q.getdrive("d:")
frD=fn.freespace/1024/1024/1024
dim fon,size
set fon=q.getfolder("F:\GHOST")
size=fon.size/1024/1024/1024
if frD>size and frD>1 then
dim ws
set ws=wscript.createobject("WScript.Shell")
ws.run "1.bat"
else
do until frD>size and frD>1
frD=fn.freespace/1024/1024/1024
set fon=q.getfolder("F:\GHOST")
size=fon.size/1024/1024/1024
set ws=wscript.createobject("WScript.Shell")
ws.run "cmd /c dir /od /ad /b d:\>folder.txt"
set file=q.opentextfile("folder.txt")
fil=file.readline
q.deletefolder "d:\"&fil,true
loop
end if
VBS版 呵呵,基本上能达到要求了,只是如果文件夹删光了还没有1G的话会有点小错误(我测试的时候是20G) 保存为 *.vbs
使用的时候请把f/ghost 改为E盘的那个文件夹
[
Last edited by zhoushijay on 2007-4-18 at 05:22 PM ]
作者: bjsh
时间: 2007-4-19 07:30
纠正ls的一个小错误
说剩余空间-文件size 是否大于1G; 而非剩余空间是否大于1G;
cmd /c dir /od /ad /b d:\>folder.txt
这个会有问题的;
首先如果 该盘为系统盘的话;很可能把隐藏的重要文件夹删除;
所以建议加上 -h
同时/od的排序是按生成时间排序的;
而lz要求的是最早的访问时间;
应该用wmic或/ta来解决这个问题;
[
Last edited by bjsh on 2007-4-18 at 08:15 PM ]
作者: bjsh
时间: 2007-4-19 07:33
此题用批处理来写
关键在于 批处理 在处理大数字上有欠缺;
而且在取得文件夹大小上也有欠缺;
而vbs在这两方面要好的多;
不过并不说明批处理无法解决;只是麻烦了点;
作者: bjsh
时间: 2007-4-19 07:35
贴出批处理版的;加了些注释;
Quote: |
- @echo off & setlocal enabledelayedexpansion
- :loop
- rem 得到d盘的剩余空间
- for /f %%i in ('wmic LOGICALDISK where "name='d:'" get freespace ^|more +1') do set "d_free=%%i"
- rem 得到e盘某文件夹的大小
- for /f "tokens=3" %%a in ('dir e:\某文件夹 /s /a ^| find "个文件"') do set "file_size=%%a" && set "file_size=!file_size:,=!"
- rem 进行差值计算 (默认为剩余空间大于文件夹的大小;否则自行修改代码)
- set "x=%d_free%"
- set "y=%file_size%"
- set "result="
- set "flag="
- call :c
- rem 返回result 判断result是否大于1G
- set "x=%result%"
- set "y=1073741824"
- set "result="
- set "flag="
- call :c
- rem 返回值P等于-1说明小于1G;返回值P等于1说明大于1G
- if "%p%"=="1" 1.bat
- if "%p%"=="-1" goto clean
- :clean
- rem 获取访问时间
- for /f %%C in ('echo %date%') do set "today=%%C" && set "today=!today:-=!"
- set "small=%today%"
- pushd d:
- for /f "delims=" %%A in ('dir /ad-h/b') do set "folder=%%A" && CALL :f_time
- echo 访问时间最早的文件是 d:\%ear_folder% ;是否要删除 & pause
- rd /s /q d:\%ear_folder%
- goto loop
- goto exit
- :f_time
- for /f %%B in ('wmic fsdir where "name='d:\\%folder%'" get LastAccessed ^|more +1') do set "ear=%%B"
- if %ear:~0,8% lss %small% set "small=%ear:~0,8%" && set "ear_folder=%folder%"
- goto exit
- rem 计算函数
- :c
- if defined flag (set /a "next=%x:~-1%-1") else (set /a "next=%x:~-1%")
- set /a "last=%next%-%y:~-1%"
- set "t=%last%"
- if %last% geq 0 (set "flag=") else (set /a "last=10+%next%-%y:~-1%" & set "flag=flag")
- set "result=%last%%result%"
- set "x=%x:~0,-1%"
- set "y=%y:~0,-1%"
- if "%x%"=="" if not "%y%"=="" set /a "p=-1" & goto exit
- if "%x%"=="" if %t% lss 0 set /a "p=-1" & goto exit
- if "%y%"=="" if not "%x%"=="" set "y=0" && set /a "p=1"
- if "%y%"=="" if "%x%"=="" if %t% geq 0 set /a "p=1" && goto exit
- goto c
- :exit
BJSH发表于: 2007-04-18 18:24 |
|
作者: bjsh
时间: 2007-4-19 07:37
仅仅是数值的计算批处理就用了30行
而vbs只需要两行代码;
[
Last edited by bjsh on 2007-4-18 at 06:38 PM ]
作者: chkau
时间: 2007-4-19 09:13
首先非常感谢bjsh大哥
其次小弟再问一下,我运行这个命令输出的需要删除的文件夹和我dir /od /ta排列出最后一次访问时间最早的文件夹不一样呢?
作者: chkau
时间: 2007-4-19 09:19
我的表达能力真是差......
估计bjsh大哥认为的是最早有访问记录的文件夹
而我想要表达的意思是上一次访问时间最早的文件夹
各位大哥...不好意思
作者: bjsh
时间: 2007-4-19 09:37
那你dir /od /ta 后;
你是想删除第一个呢?还是想删除最后一个呢?
作者: chkau
时间: 2007-4-19 09:41
第一个,也就是应该是最少有人访问那个
作者: bjsh
时间: 2007-4-19 09:44
你试试这个
我修改过了;
Quote: |
- @echo off & setlocal enabledelayedexpansion
- :loop
- for /f %%i in ('wmic LOGICALDISK where "name='d:'" get freespace ^|more +1') do set "d_free=%%i"
- for /f "tokens=3" %%a in ('dir e:\某文件夹 /s /a ^| find "个文件"') do set "file_size=%%a" && set "file_size=!file_size:,=!"
- set "x=%d_free%"
- set "y=%file_size%"
- set "result="
- set "flag="
- call :c
- set "x=%result%"
- set "y=1073741824"
- set "result="
- set "flag="
- call :c
- if "%p%"=="1" 1.bat
- if "%p%"=="-1" for /f "delims=" %%A in ('dir /od /ta /b d:') do set "ear_folder=%%A" && goto jump
- :jump
- echo 访问时间最早的文件是 d:\%ear_folder% ;是否要删除 & pause
- rd /s /q d:\%ear_folder%
- goto loop
- :c
- if defined flag (set /a "next=%x:~-1%-1") else (set /a "next=%x:~-1%")
- set /a "last=%next%-%y:~-1%"
- set "t=%last%"
- if %last% geq 0 (set "flag=") else (set /a "last=10+%next%-%y:~-1%" & set "flag=flag")
- set "result=%last%%result%"
- set "x=%x:~0,-1%"
- set "y=%y:~0,-1%"
- if "%x%"=="" if not "%y%"=="" set /a "p=-1" & goto exit
- if "%x%"=="" if %t% lss 0 set /a "p=-1" & goto exit
- if "%y%"=="" if not "%x%"=="" set "y=0" && set /a "p=1"
- if "%y%"=="" if "%x%"=="" if %t% geq 0 set /a "p=1" && goto exit
- goto c
- :exit
BJSH发表于: 2007-04-18 20:38 |
|
[
Last edited by bjsh on 2007-4-18 at 08:49 PM ]
作者: chkau
时间: 2007-4-19 22:48
测试成功!非常感谢!!!
作者: htysm
时间: 2007-4-20 00:10
看得眼花,但是还是要加分。^O^
作者: chkau
时间: 2007-4-21 23:48
再请问一下bjsh大哥,我想在本地计算机自动以其他用户身份执行这个批处理,有办法实现吗?
runas要手动去输入密码的
作者: chkau
时间: 2007-4-22 02:06
大哥们帮看看啊,别沉了
作者: chkau
时间: 2007-4-24 12:33
BJSH大哥,有了个疑难问题啊,我今天用下那个代码,%A赋值出来不管怎么搞都是为空,也就是说一直提醒我删D:\,而不是D:\访问最早的文件夹,而我把那两行代码复制出来另外做个BAT,又能正确赋值,我想破了头也想不通是怎么回事,麻烦你帮我看一下啊,谢谢了
作者: bjsh
时间: 2007-4-24 12:56
你把16行的set "ear_folder=%%A"改为echo %%A & pause 测试下看看回显.
作者: chkau
时间: 2007-4-24 13:10
忘记说了,我把1.bat改了个名字,试出来就是这个结果了,还有我在if "%p%"=="-1" for /f "delims=" %%A in ('dir /od /ta /ad /b d:\') do set "ear_folder=%%A" && goto jump
这一行里的dir后面加了/ad参数,我只想找到文件夹
还有我set "ear_folder=%%A"改为echo %%A & pause 后,还是提示我删除D:\
作者: chkau
时间: 2007-4-24 13:19
我在cmd里面执行这个批处理>>1.txt
1.txt里面是这个
访问时间最早的文件是 d:\ ;是否要删除
请按任意键继续. . .
作者: chkau
时间: 2007-4-24 13:28
我发现个问题
if "%p%"=="-1" for /f "delims=" %%A in ('dir /od /ta /b d:') do set "ear_folder=%%A" && goto jump
这一行里那个d:后面要加一个\,否则如果该批处理在D盘里面某个文件夹下面的话,dir出来的结果会是当前文件夹里的文件列表,而不是D盘根目录里的
作者: chkau
时间: 2007-4-24 13:41
BJSH大哥,我好像发现问题了,这个脚本就是在找不到1.bat的情况下出的错,如果能找到1.bat或者是D盘剩余空间比要对比的文件夹大不了1G,都不会出错
也就是说在%P%的判定的时候出的问题,附作用
帮我看看是吗?谢谢啊^^BJSH大哥
作者: bjsh
时间: 2007-4-26 12:28
是的;
能自己找到问题的所在;对你会有很大的提高啊!
就是在d盘剩余空间大于对比文件1G且找不到1.bat的情况下;
会出现问题
if "%p%"=="1" 1.bat
if "%p%"=="-1" for /f "delims=" %%A in ('dir /od /ta /b d:') do set "ear_folder=%%A" && goto jump
:jump
echo 访问时间最早的文件是 d:\%ear_folder% ;是否要删除 & pause
rd /s /q d:\%ear_folder%
%p%==1了但是因为没有1.bat所以就直接跳到了jump标签处;
而且因为一开始D盘的剩余空间就大于对比文件1G;
因此%P% 没有等于过 -1
因此%ear_folder%没有定义过;
因此为空;
所以提示删除 d:\%ear_folder%时会提示删除 d:\
如果开始D盘剩余空间比要对比的文件夹大不了1G
则 if "%p%"=="-1"至少被循环了一次;%ear_folder%也就有了定义;因此就不会出错;
解决办法就是:
保证1.bat存在;
或这改写
if "%p%"=="1" 1.bat
这句中的1.bat为你的要执行bat文件名即可
作者: chkau
时间: 2007-4-26 15:44
全托你的福^^我会不断努力提高的,BJSH大哥不要嫌我麻烦啊