我正在重写批处理文件以计算页面文件的使用情况:
@ECHO OFF
for /f "tokens=1,2 skip=2 delims==" %%a in ('wmic pagefile list /format:list') do (
IF "%%a"=="AllocatedBaseSize" SET TOTAL=%%b
IF "%%a"=="CurrentUsage" SET USAGE=%%b
)
SET TOTAL
SET USAGE
set /a perc = 100 * USAGE / TOTAL
echo used: %perc%%%
----- OUTPUT -----
TOTAL=4095
USAGE=728
used: 17%
到目前为止,我能够模仿它:
(for /f "tokens=1,2 skip=2 delims==" %a in ('wmic pagefile list /format:list') do @(IF "%a"=="AllocatedBaseSize" (SET TOTAL=%b) ELSE (IF "%a"=="CurrentUsage" SET USAGE=%b))) & SET TOTAL & SET USAGE & set /A perc=100*USAGE/TOTAL & echo|set /p dummy=% of usage
----- OUTPUT -----
TOTAL=4095
USAGE=724
17% of usage
但这只是因为我使用了非常丑陋的黑客echo|set /p dummy=% of usage
。我的问题是,当我尝试echo %perc%%
时,它会打印%perc%%
。所以现在我只是追加"使用"到set /A
的输出 - 首先是因为根据文档set /?
似乎无法省略此输出:
如果从a以外的命令行执行SET / A. 命令脚本,然后显示表达式的最终值。
和第二,因为我无法打印perc
变量的值。
为清楚起见,我的问题可以简化为:
C:\>set x=1 & echo %x%
%x%
C:\>echo %x%
1
欢迎任何帮助/解释。
也尝试SetX variable value
。
答案 0 :(得分:1)
更改行
set x=1 & echo %x%
到
setlocal EnableDelayedExpansion
set "x=1" & echo !x!
并命令 echo 按预期输出 1 。
在执行括号中的行或块之前, cmd.exe 将所有对环境变量的引用替换为其当前值。因此,必须使用setlocal EnableDelayedExpansion
启用的延迟环境变量扩展,并在变量引用周围使用!
而不是%
,在这种情况下,变量值分别在同一行上修改/设置在同一个街区。
并在 variable = value 周围使用双引号,如此处所示。另一个例子:
set /A "perc=100*USAGE/TOTAL"
答案 1 :(得分:1)
cmd /v:on /c "for /f "skip=2 tokens=2,3 delims=," %a in ('wmic pagefile get allocatedbasesize^,currentusage^,status /format:csv') do @(set /a "pct=%b*100/%a">nul & echo total: %a & echo usage: %b & echo used : !pct!^%)"