Удалить папку если её размер больше 100 Gb
Здравствуйте, как проверить размер занимаемого места на разделе для определенной папки, и если он превышает лимит - удалить папку минуя корзину?
Код:
@echo off
if not exist "c:\_acestream_cache_\" (
exit
)
<--- Если размер больше 100 gb --->
RD /s/q "c:\_acestream_cache_\"
del /f /q %appdata%\.ACEStream\buffer\*.*
::del /f /q %appdata%\.ACEStream\collected_torrent_files\*.*
del /f /q %appdata%\.ACEStream\dlcheckpoints\*.*
del /f /q %appdata%\.ACEStream\dldcheckpoints\*.*
del /f /q %appdata%\.ACEStream\*.log
exit
|
Код:
@echo off
setlocal
for /f "tokens=1" %%i in ('dfp "C:\Folder" /s') do set "size=%%i"
if %size% geq 107374182400 rd /s /q "C:\Folder"
Должно работать на 8-ке и 10-ке. Не знаю есть ли dfp.exe в предыдущих версиях.
|
Цитата:
Цитата Foreigner
Не знаю есть ли dfp.exe в предыдущих версиях. »
|
Немае :(.
А сработает ли сравнение как числовое? В ранних версиях были ограничения 2^32-1, помнится.
|
Iska, Точно, не работает, надо нули добавлять в начало (я сравнивал равное кол-во знаков 400Gb co 100Gb):
Код:
@echo off
setlocal
for /f "tokens=1" %%i in ('dfp "C:\Folder" /s') do set "size=000000000000%%i"
if %size:~-12% geq 107374182400 rd /s /q "C:\Folder"
|
Foreigner, ещё один возможный подводный камень — не попытается ли «if» воспринимать некоторые строки, начинающиеся с «0…», как восьмеричные (не проверял)?
|
Iska,
Цитата:
Цитата Iska
воспринимать некоторые строки, начинающиеся с «0…», как восьмеричные »
|
В самом вопросе противоречие. При равной длине строк сравнение будет корректным, т.к коды символов идут подряд:
Код:
0..9 | % { [int][char]"$_" } # 48..57
|
Цитата:
Цитата Foreigner
Должно работать на 8-ке и 10-ке. Не знаю есть ли dfp.exe в предыдущих версиях. »
|
Windows 7: "dfp" не является внутренней или внешней командой, исполняемой программой или пакетным файлом.
|
fokanik, попробуйте на WSH (не проверялось):
Скрытый текст
Код:
Option Explicit
Dim strSourceFolder
Dim strACEStreamFolderInAppData
Dim strTemplate
With WScript.CreateObject("Scripting.FileSystemObject")
strSourceFolder = "c:\_acestream_cache_"
If .FolderExists(strSourceFolder) Then
.DeleteFolder strSourceFolder, True
strACEStreamFolderInAppData = .BuildPath(WScript.CreateObject("Shell.Application").NameSpace("shell:AppData").self.Path, ".ACEStream")
For Each strTemplate In Array( _
"buffer\*.*", _
"dlcheckpoints\*.*", _
"dldcheckpoints\*.*", _
"*.log" _
)
.DeleteFile objFSO.BuildPath(strACEStreamFolderInAppData, strTemplate), True
Next
Else
' Nothing to do
End If
End With
WScript.Quit 0
|
greg zakharov |
01-11-2015 16:11 2570424 |
fokanik, дык Вы бы сразу озвучили версию системы. Можно попытать счастья такой командой:
Код:
@powershell /nop /ex bypass "&{if((ls -r($$='C:\Folder')|?{!$_.PSIsContainer}|measure -pr length -s).Sum -ge 100Gb){ri $$ -for}}"
Если не нравится вызывать из консоли posh, можно прибегнуть к утонченным извращениям с robocopy, благо в семерке он поставляется в комплекте; нужно обратить внимание на ключи /L, /MAX и, если память не изменяет, /MIR. Если подобный садомизм не для Вас, можно пойти по пути пролетариата гибридов: cmd+mshta, cmd+javascript и дыр и пыр в этом пирдухе.
|
Цитата:
Цитата Iska
fokanik, попробуйте на WSH (не проверялось): »
|
Не знаю как это запускается.
Цитата:
Цитата greg zakharov
Можно попытать счастья такой командой: »
|
Закинул эту строчку в батник, работает, спасибо :oszone: Дыр, пир, mir - не треба.
|
fokanik, Если нет dfp.exe, тогда по-старинке:
Код:
@echo off
1>nul chcp 437
setlocal
for /f "tokens=3" %%i in ('dir /a-d /s /-c "C:\Folder" ^| findstr "File(s)"') do set "n=000000000000%%i"
if "%n:~-12%" geq "107374182400" rd /s /q "C:\Folder"
1>nul chcp 866
|
Цитата:
Цитата fokanik
Не знаю как это запускается. »
|
Сохранить приведённый код в файл с расширением «.vbs».
|
Foreigner,
Цитата:
D:\Test>if 107374182399 geq 107374182400 echo Yes!
Yes!
|
.
|
Georgio,
Код:
if "107374182399" geq "107374182400" echo Yes!
|
Foreigner, верно, эти числа можно сравнивать только лексикографически.
|
Время: 20:23.
© OSzone.net 2001-