2017-04-14 67 views
0

我試圖循環遍歷系統中的所有dimms,並將它們寫入文本文件。我知道我可以使用WMIC的/Append或CMD的重定向(>>),但可以附加輸出Unicode和批處理文件重定向輸出的其他部分,即ANSI。另外,兩種標準方法都會輸出大量的空白行。在FOR循環中對每個項目執行的批處理文件

echo off 
setlocal EnableDelayedExpansion 
set _invpath="c:\temp\%COMPUTERNAME%-Inventory.txt" 
for /f "tokens=2 delims==" %%f in ('wmic memorychip get devicelocator /value') do (
    if [!f] NEQ [] (
    set "MemoryDeviceLocator=%%f" 
    set _prefix=%MemoryDeviceLocator:~0,4% 
    if [%_prefix%]==[DIMM] (
     for /f "usebackq tokens=2 delims==" %%g in (`wmic memorychip where 'devicelocator^="%MemoryDeviceLocator%"' get capacity /value ^| find "="`) do set "Capacity=%%g" 
     for /f "usebackq tokens=2 delims==" %%h in (`wmic memorychip where 'devicelocator^="%MemoryDeviceLocator%"' get serialnumber /value ^| find "="`) do set "SerialNumber=%%h" 
     for /f "usebackq tokens=2 delims==" %%i in (`wmic memorychip where 'devicelocator^="%MemoryDeviceLocator%"' get speed /value ^| find "="`) do set "Speed=%%i" 
     echo %MemoryDeviceLocator%=%MemoryDeviceLocator% >> %_invpath% 
     echo %MemoryDeviceLocator%Capacity=%Capacity% >> %_invpath% 
     echo %MemoryDeviceLocator%SerialNumber=%SerialNumber% >> %_invpath% 
     echo %MemoryDeviceLocator%Speed=%Speed% >> %_invpath% 
    ) 
) 
) 

這按照我想要的方式格式化輸出,但只顯示最後一個DIMM,而不是每個DIMM。例如:

DIMM2=DIMM2 
DIMM2Capacity=4294967296 
DIMM2SerialNumber=9169FG56 
DIMM2Speed=1333 
DIMM2=DIMM2 
DIMM2Capacity=4294967296 
DIMM2SerialNumber=9169FG56 
DIMM2Speed=1333 

如何修改批處理以輸出DIMM1的信息?

編輯,以顯示我的enabledelayedexpansion線

+1

您需要[延期擴展](http://ss64.com/nt/delayedexpansion.html)... – aschipfl

回答

0

我設法想出解決辦法。我道歉。我已經啓用延遲擴展,我應該包括該批處理文件的那一部分。

這裏是我如何解決它:

echo off 
setlocal EnableDelayedExpansion 
set _invpath="c:\temp\%COMPUTERNAME%-Inventory.txt" 
for /f "tokens=2 delims==" %%f in ('wmic memorychip get devicelocator /value') do (
    call set "MemoryDeviceLocator=%%f" 
    call set _prefix=!MemoryDeviceLocator:~0,4! 
    if [!_prefix!]==[DIMM] (
    echo !MemoryDeviceLocator!=!MemoryDeviceLocator! >> %_invpath% 
    for /f "usebackq tokens=2 delims==" %%g in (`wmic memorychip where 'devicelocator^="!MemoryDeviceLocator!"' get capacity /value ^| find "="`) do call set "Capacity=%%g" 
    echo !MemoryDeviceLocator!Capacity=!Capacity! >> %_invpath% 
    for /f "usebackq tokens=2 delims==" %%g in (`wmic memorychip where 'devicelocator^="!MemoryDeviceLocator!"' get serialnumber /value ^| find "="`) do call set "SerialNumber=%%g" 
    echo !MemoryDeviceLocator!SerialNumber=!SerialNumber! >> %_invpath% 
    for /f "usebackq tokens=2 delims==" %%g in (`wmic memorychip where 'devicelocator^="!MemoryDeviceLocator!"' get speed /value ^| find "="`) do call set "Speed=%%g" 
    echo !MemoryDeviceLocator!Speed=!Speed! >> %_invpath% 
) 
) 

我不是100%肯定%variable%!variable!之間準確的區別是什麼,但我知道在當時的感嘆號勢力擴張的變量它被閱讀。

+1

'%var%'指的是代碼塊(括號內)的var * *的值遇到*系列命令)。調用'delayexpansion'的'!var!'指的是變量的當前(運行時間)值。就是這樣,因爲當解析器驗證該行的語法有效性時,它會用*當前值*和*替換任何'%var%',然後*指令被執行。這是語法分析器數十年來的工作方式 - 有必要提供透明的向後兼容性。 – Magoo