我有一个 Windows(Windows 7/2008 R2)批处理文件,它每天备份文件。(Oracle 转储导出文件,例如 dump-2016-10-17.DMP)
我想添加文件大小(在变量中),根据大小应以 KB/MB/GB 为单位,或者至少应以 MB 为单位获取文件大小。代码:
@echo off
SET DONE=0
SET Bytes=%~z1
SET KB=%Bytes:~0,-3%
SET MB=%Bytes:~0,-6%
SET GB=%Bytes:~0,-9%
SET TB=%Bytes:~0,-12%
rem echo %~f1
IF "%KB%" EQU "" SET DONE=B
IF %DONE% EQU B echo Size is... %Bytes% Bytes
IF %DONE% EQU B GOTO END
IF "%MB%" EQU "" SET DONE=K
IF %DONE% EQU K SET /a KB=(%BYTES%/1024)+1
IF %DONE% EQU K echo Size is... %KB% KB
IF %DONE% EQU K GOTO END
IF "%GB%" EQU "" SET DONE=M
IF %DONE% EQU M SET /a MB=(%BYTES%/1048576)+1
IF %DONE% EQU M echo Size is... %MB% MB
IF %DONE% EQU M GOTO END
IF "%TB%" EQU "" SET DONE=M
IF %DONE% EQU M SET /a MB=%KB%/1049
IF %DONE% EQU M echo Size is... %MB% MB (approx)
IF %DONE% EQU M GOTO END
SET DONE=G
IF %DONE% EQU G SET /a GB=%MB%/1074
IF %DONE% EQU G echo Size is... %GB% GB (approx)
IF %DONE% EQU G GOTO END
:END
答案1
作为替代方案,您可以使用robocopy
命令的输出来检索所需的信息
@echo off
setlocal enableextensions disabledelayedexpansion
set "file=d:\somewhere\file.ext"
for %%z in ("%file%") do for /f "tokens=1,2" %%a in ('
robocopy "%%~dpz." "%%~dpz." "%%~nxz" /l /nocopy /is /njh /njs /ndl /nc
') do if "%%~dz"=="%%~db" (
echo "%%~z" : [%%a]
) else (
echo "%%~z" : [%%a%%b]
)
robocopy
将仅用于列出(/l
)正在复制的文件的信息,从输出中删除任何不需要的信息(其余开关),并使用命令for /f
标记输出行并仅读取文件大小
对于文件夹,可以使用同样的想法,但不是从文件列表中读取数据,我们可以使用递归“复制”并从工作摘要中检索数据
@echo off
setlocal enableextensions disabledelayedexpansion
set "folder=%~f1" & if not defined folder set "folder=%cd%"
set "size=" & for %%z in ("%folder%") do for /f "skip=2 tokens=2,3 delims=: " %%a in ('
robocopy "%%~fz\." "%%~fz\." /l /nocopy /s /is /njh /nfl /ndl /r:0 /w:0 /xjd /xjf /np
^| find ":"
') do if not defined size (
(for /f "delims=0123456789." %%c in ("%%b") do (break)) && (
set "size=%%a%%b"
) || (
set "size=%%a"
)
)
echo "%folder%" : [%size%]
开关更改为仅检索作业摘要,并进行过滤以仅读取包含信息的行Bytes
。
編輯2016/10/26 - 更改了 robocopy 开关以应对权限问题,将Byte:
检索更改为:
行过滤器加上跳过子句,以防万一出现没有Bytes:
字符串的区域设置,更改了存储单元检测。
答案2
一种解决方案是从其他批次中调用该批次,并将备份文件作为参数。您将以文本形式获取大小,并将其保存在变量中。
要“内联”执行此操作,您可以在循环中使用它,如下所示:
for %f in (%backupfile%) do set BYTES=%~zf
从可读性的角度来看,第一个解决方案会更好。
答案3
感谢您的支持和指导。
我最终设法通过下载适用于 Windows 的版本解决了这个问题ls
,并且通过它ls -lh filename
我获得了我需要的信息以及其他信息。
例子:
D:\zaib>D:\tools\ls.exe -lh setup.exe
-rwxr-x--a 1 Administrators 590M Oct 6 2015 setup.exe
答案4
你需要两样东西。
filesize.bat
@echo off
echo %~z1
然后你实际上试图确定这里报告的值
因此,在这个例子中,我评估 %z% 以仅当文件大于零时才复制文件/仅复制非零文件
for /f %i in ('filesize filesize.bat') do set z=%i
if %z% gtr 0 ( copy filesize.bat noodles.bat )
像获取 %z% 这样的操作可以让你做一些截断数学运算或者其他操作,但是获取大小本身却有点麻烦。