2016-02-22 52 views
1

我是随便我怎么会作出这样的设置文件夹设置为只读,如果到达上述尺寸A批处理文件批处理文件大小限

我走到这一步(1GB):

@echo off 
color 0b 
set /p slimit=Set Max file size: 
set /p location=Folder Directory: 
cls 
color 0a 
:loop 





echo Limiting File "%location%" at %slimit%. 
ATTRIB +R %location% /sd | if errorlevel 1 goto :next1 
:next1 




echo Limiting File "%location%" at %slimit%.. 
ATTRIB +R %location% /sd | if errorlevel 1 goto :next2 
:next2 




echo Limiting File "%location%" at %slimit%... 
ATTRIB +R %location% /sd | if errorlevel 1 goto :next3 
:next3 



goto :loop 

真的,我唯一能做的就是当它达到极限组时,它使用attrib字符串。此外,错误级别可能会非常糟糕,我第一次使用错误级别。

+1

是一个批处理脚本[真的是最好的解决方案(https://4sysops.com/archives/file-server-resource-manager-fsrm-part-3-quota-management/)在这里? – rojo

回答

0

要获得文件夹的大小,您需要递归枚举所有文件并获取它们的大小。有关说明,请参阅下面代码中的rem声明。

@echo off & setlocal enabledelayedexpansion 

set /a "sizelimit = 1 << 30" & rem // 1GB 

rem // GUI folder chooser 
rem // http://stackoverflow.com/a/15885133/1683264 
set "psCommand="(new-object -COM 'Shell.Application')^ 
.BrowseForFolder(0,'Please choose a folder.',0,0).self.path"" 
for /f "usebackq delims=" %%I in (`powershell %psCommand%`) do set "folder=%%I" 

if not defined folder goto :EOF 

rem // get volume blocksize to determine each file's size on disk later 
rem // http://stackoverflow.com/a/30894749/1683264 
for %%I in ("%folder%") do for /f %%J in (
    'wmic volume where "driveletter='%%~dI'" get blocksize /value' 
) do 2>nul set /a %%J 

set /P "=Enumerating files in %folder%... "<NUL 

rem // use "/a:-d" switch to specify *all* files, including hidden and system 
for /f "delims=" %%I in ('dir /s /b /a:-d "%folder%"') do (

    rem // check individual file to avoid math exceeding 32-bits 
    if %%~zI geq !sizelimit! goto readOnly 

    set /a "sizelimit -= ((%%~zI - 1)/blocksize + 1) * blocksize" 
) 

echo Size limit not exceeded. 
goto :EOF 

:readOnly 
echo Setting to read-only. 
attrib +r "%folder%" /sd 
+0

它没有工作,它到了选择文件夹弹出,但没有做任何事情,但我选择了文件夹后退出 –

+0

哦,它没有,它只是没有循环,我改变GOTO:EOF goto:顶部,现在它做我需要的! –