2014-11-11 1 views
0
나는 한 줄에 계산 페이지 파일 사용에 대한 배치 파일을 다시 작성하고 있습니다

:명령 : 한 줄에서 작동하지 않는 에코

:

@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 /?에 따라이 출력을 생략하는 것은 불가능하다는 것 때문에 :

SET/A는 명령 줄에서 실행되는 경우 명령 스크립트 외부에있는 경우 표현식의 최종 값을 표시합니다.

perc 변수 값을 인쇄 할 수 없기 때문에 두 번째.

C:\>set x=1 & echo %x% 
%x% 
C:\>echo %x% 
1 

어떤 도움/설명이 환영 :

는 명확하게하기 위해 내 문제는 단순화 할 수있다.

시도한 SetX variable value도 있습니다.

+0

이 글을 쓰는의 끝에서 나는 새로운 쉘을 산란하는 생각이있어 (IF "% a"== "CurrentUsage"SET USAGE = % b))) & SET (IF "% a"== "AllocatedBaseSize"(SET TOTAL = % b) TOTAL & SET USAGE & set/A perc = 100 * USAGE/TOTAL & cmd/K "에코 사용은 % perc %%"입니다. 물론 작동하지만 여전히'set/A'는 원하지 않는 문자열을 출력합니다. 지금은 피곤하다. - 올바른 방법으로) –

+2

명령 줄에서'cmd/V : ON/C set/A x = 2-1 ^> NUL^& echo! x!'명령을 실행하면 다음과 같이 표시된다. '1'. 이 방법은 또한 작동합니다 :'cmd/V : ON/C "set/A x = 2-1> NUL & echo! x!"' – Aacini

답변

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!^%)" 
+0

아주 좋습니다. 내가 많이 배울 다른 접근법. 감사! –

+0

평소와 같이 BTW는 [Win7에 버그가있다] (http://stackoverflow.com/a/18284780/1136008) 때문에'wmic' 쿼리를'wmic pagefile get allocatedbasesize^currentusage ^, 상태/형식 : "% WINDIR % \ System32 \ wbem \ en-us \ csv" –

1

변경

setlocal EnableDelayedExpansion 
set "x=1" & echo !x! 

및 명령 에 광고

set x=1 & echo %x% 

1 예상대로 출력 에코.

cmd.exe은 괄호로 묶인 줄 또는 블록을 실행하기 전에 이미 현재 값으로 환경 변수에 대한 모든 참조를 바꿉니다. 따라서 setlocal EnableDelayedExpansion으로 설정된 지연된 환경 변수 확장을 사용하고이 경우 변수 값이 동일한 블록의 동일한 줄에서 각각 수정되고 설정된 변수 참조를 % 대신 !으로 사용하는 것이 필요합니다.

여기에 표시된대로 변수 = 값 주위에 큰 따옴표를 사용하십시오. 또 다른 예 :`(/ F는 "토큰 = 1,2 = 2 delims == 건너"('WMIC에 % a를 :

set /A "perc=100*USAGE/TOTAL" 
+1

은 한 줄 짜기에서 작동하지 않습니다. setlocal'이 실행됩니다. – Stephan

+0

Stephan이 맞습니다. 전에'setlocal EnableDelayedExpansion'을 시도해 보았습니다. @mofi'setlocal EnableDelayedExpansion & set "x = 1"& echo! x!' –

+0

예, 제가 대답을 썼을 때 [Stephan ] (http://stackoverflow.com/users/2152082/stephan) 내 코드 조각이 두 줄을 포함하는 이유는 썼습니다. 첫 번째 줄과 두 번째 줄을 한 줄로 결합 할 수 없다는 것을 명시 적으로 설명해야하는 것처럼 보입니다. 한편 [MC ND] (http://stackoverflow.com/users/2861476/mc-nd)는 단일 라인 솔루션을 게시했습니다. 지연된 확장은 Windows 레지스트리에서 기본적으로 활성화 될 수 있습니다. [DelayedExpansion] (http://technet.microsoft.com/en-us/library/cc957361.aspx) 레지스트리 값에 대한 Microsoft 문서를 참조하십시오. – Mofi

관련 문제