2013-10-23 76 views
1

我想獲得最高的內存消耗進程id在批處理文件。這到目前爲止,我達成了,但它不是炒作。seting變量裏面如果其他嵌套for循環不workin

@echo off 
set old=0 
for /f "TOKENS=1" %%a in ('wmic PROCESS where "Name='cmd.exe'" get WorkingSetSize ^| findstr [0-9]') do if %%a GTR %old% (set old=%%a) 
echo %old% 
+1

你需要'SETLOCAL ENABLEDELAYEDEXPANSION'並將其替換'%舊%'' !老了!'。 請參閱'set /?'獲取解釋。 –

+0

只爲備案,最多隻能比較2 GB使用普通批次 – foxidrive

+1

感謝Butter,Foxdrive:最大2GB,表示批量變量不能保存超過2 * 1024 * 1024 * 8的數值。是嗎? –

回答

1

這應該工作...

@echo off 
Setlocal ENABLEDELAYEDEXPANSION 
set old=0 
for /f "TOKENS=1" %%a in ('wmic PROCESS where "Name='cmd.exe'" get WorkingSetSize ^| findstr [0-9]') do (
    if %%a GTR !old! (
    set old=%%a 
) 
echo !old! 
) 

Set /?解釋延遲的環境變量擴展...

Delayed environment variable expansion is useful for getting around 
the limitations of the current expansion which happens when a line 
of text is read, not when it is executed. The following example 
demonstrates the problem with immediate variable expansion: 

set VAR=before 
if "%VAR%" == "before" (
     set VAR=after 
     if "%VAR%" == "after" @echo If you see this, it worked 
    ) 

would never display the message, since the %VAR% in BOTH IF statements 
is substituted when the first IF statement is read, since it logically 
includes the body of the IF, which is a compound statement. So the 
IF inside the compound statement is really comparing "before" with 
"after" which will never be equal. Similarly, the following example 
will not work as expected: 

    set LIST= 
    for %i in (*) do set LIST=%LIST% %i 
    echo %LIST% 

in that it will NOT build up a list of files in the current directory, 
but instead will just set the LIST variable to the last file found. 
Again, this is because the %LIST% is expanded just once when the 
FOR statement is read, and at that time the LIST variable is empty. 
So the actual FOR loop we are executing is: 

    for %i in (*) do set LIST= %i 

which just keeps setting LIST to the last file found. 

Delayed environment variable expansion allows you to use a different 
character (the exclamation mark) to expand environment variables at 
execution time. If delayed variable expansion is enabled, the above 
examples could be written as follows to work as intended: 

    set VAR=before 
    if "%VAR%" == "before" (
     set VAR=after 
     if "!VAR!" == "after" @echo If you see this, it worked 
    ) 

    set LIST= 
    for %i in (*) do set LIST=!LIST! %i 
    echo %LIST%