批处理脚本删除大于 50 GB 的 .ost

Posted

技术标签:

【中文标题】批处理脚本删除大于 50 GB 的 .ost【英文标题】:batch script delete .ost bigger than 50 GB 【发布时间】:2015-12-28 10:40:12 【问题描述】:

我正在尝试制作一个批处理脚本来删除大于 50GB 的 Outlook .ost 文件。但是带有“for”命令的循环让我发疯:( 也尝试使用“forfiles”命令,但没有幸运。 有什么想法吗?

嗨丹尼斯! 抱歉延迟退房... 我已经用小 ost 测试过它并且可以工作......但是...... IF 命令不适用于大文件......高达〜2GB。我尝试了一个 45GB 的文件。

检查一下:

IF 2147483647 GTR 2147483646 echo A 大于 B(将为 TRUE)

IF 2147483648 GTR 2147483647 echo A 大于 B(将是 FALSE!)

就像在: How can I check the size of a file in a Windows batch script?

我尝试转换为 GB 但不起作用:

FORFILES /P "%localappdata%\Microsoft\Outlook" /S /M *.ost /C "cmd /c set /a ostsize=@fsize/1073741824 echo @file"

但是不行,后来发现forfiles命令有问题:

FORFILES /P "%localappdata%\Microsoft\Outlook" /S /M *.ost /C "cmd /c echo=@fsize"

尝试使用 45GB 文件并返回 8052032512 值...:S 我卡住了!

【问题讨论】:

请在发帖前先谷歌,告诉我们你已经做了什么。 可惜你不愿意学习如何使用for 命令;这正是您所需要的。 【参考方案1】:

if 似乎无法将这么大的数字解释为字符串(请参阅相关问题 weird results with IF),就像人们认为的那样。

而且由于数字被限制为 32 位整数,因此处理较大数字的唯一选择是明确强制 if 将它们作为字符串进行比较(通过用 qoutes 将它们括起来)。

另外,我在它们前面加了一堆零,然后将它们限制为固定长度(因为用字符串比较,41大于296(4大于2),但是字符串"00041" 小于字符串 "00296" - 严格比较字符串从第一个字符到最后一个字符)

@echo off
set "size1=2147483647"
set "size2=2147483646"
set "null=000000000000000"
set "size1=%null%%size1%"
set "size2=%null%%size2%"
set "size1=%size1:~-15%"
set "size2=%size2:~-15%"
if "%size1%" gtr "%size2%" echo size1 is greater

【讨论】:

IF "2147483648" GTR "2147483647" echo A 大于 B(将是 FALSE!)-> 现在有效!!!我不知道报价!!!但我无法修复: FORFILES /P "%localappdata%\Microsoft\Outlook" /S /M *.ost /C "cmd /c echo=@fsize" 如果 *.ost 大小小于 8052032512 有效,但如果更大仍然显示 8052032512。似乎“forfiles”命令看不到超过 8052032512 字节:S【参考方案2】:

好的,我找到了解决方案:WMIC 来救援!!!!

做一个 wmic 查询并放入一个变量中:

for /f "tokens=2 delims==" %%f in ('wmic datafile where "path='\\Users\\%username%\\AppData\\Local\\Microsoft\\Outlook\\' and Extension='ost' and FileSize>'48318382080'" get Name /value ^| find "="') do set "file=%%f"

【讨论】:

【参考方案3】:

首先,欢迎来到***。在这个站点上,提供您自己尝试过的代码来解决您无法解决的问题是一种习惯做法,因为这是一个供人们互相帮助编写代码的站点,而不是免费的编码服务。

因为这个特殊的问题很容易解决,这就是你需要的:

@echo off
FORFILES /S /M *.ost /C "cmd /c if @fsize gtr 53687091200 del @file"

【讨论】:

效果很好!只是想从头开始......我不会再这样做了,我发誓我妈妈! Except... 这不起作用,因为“if”语句无法评估有符号 32 位大小的数字。因此,您的代码根本不适用于查找大小超过 50gb 的文件,您可以搜索的最大大小为 2147483646。我通过 Google 发现并测试了我的代码。

以上是关于批处理脚本删除大于 50 GB 的 .ost的主要内容,如果未能解决你的问题,请参考以下文章

Wix:处理大于 2 GB 的文件

Python 3 - pickle 可以处理大于 4GB 的字节对象吗?

批处理 - 特定文件夹的文件大小(以 GB 为单位)的脚本

加快约 50GB CSV 文件的轻量级处理

用于复制大于 700MB 的最新文件的批处理脚本

使用批处理/powershell 脚本设置自定义行分隔符