cmd:echo不能在单行中工作

时间:2014-11-11 04:33:49

标签: batch-file cmd

我正在重写批处理文件以计算页面文件的使用情况:

@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

2 个答案:

答案 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!^%)"