Вместо:
do (set /A "ramcapacity=%%G" & set /A "ramslots=%%H")
просто напишите:
do (set /A "ramcapacity=%%G" & set /A "ramslots=%%H") 2> nul
Часть 2> nul
просто подавляет сообщения об ошибках.
Причиной root сообщения об ошибке является тот факт, что wmic
возвращает текст Unicode, который for /F
не может правильно преобразовать его в текст ASCII / ANSI, потому что он оставляет потерянные символы возврата каретки. Итак, в вашей ситуации после строки с информацией о памяти for /F
повторяется еще раз, делая доступным такой символ в %%G
, следовательно, пытаясь использовать его set /A "ramcapacity=%%G"
, что, наконец, возвращает сообщение об ошибке.
Чтобы избежать таких артефактов преобразования, вложите еще один for /F
l oop, например:
for /F "skip=1 delims=" %%I in ('
wmic /NODE:"%Computer%" MemPhysical get MaxCapacity^,MemoryDevices
') do (
for /F "tokens=1,2" %%G in ("%%I") do (
set /A "ramcapacity=%%G" & set /A "ramslots=%%H"
)
)
В общем, я рекомендую использовать опцию /VALUE
для wmic
команда, что приводит к следующему выводу:
MaxCapacity=67108864
MemoryDevices=4
, потому что это позволяет избежать заполнения строк значений пробелами справа (хотя они не мешают в вашей ситуации, так как вы используете set /A
):
set "ramcapacity=" & rem // (ensure this variable is initially undefined)
for /F "delims=" %%I in ('
wmic /NODE:"%Computer%" MemPhysical get MaxCapacity^,MemoryDevices /VALUE
') do (
for /F "tokens=2 delims==" %%J in ("%%I") do (
rem // The condition ensures that the only first line is processed:
if not defined ramcapacity set /A "ramcapacity=%%J"
rem // Here is no condition, so the last (second) line is relevant:
set /A "ramslots=%%J"
)
)
Я бы даже go на один шаг дальше и избегал явного определения переменных, таких как ramcapacity
и ramslots
, потому что возвращенные строки MaxCapacity=67108864
и MemoryDevices=4
уже выглядят как идеальные выражения для команды set
:
for /F "delims=" %%I in ('
wmic /NODE:"%Computer%" MemPhysical get MaxCapacity^,MemoryDevices /VALUE
') do (
for /F "delims=" %%J in ("%%I") do (
rem // This implicitly defines variables `MaxCapacity` and `MemoryDevices`:
set /A "%%J"
)
)
set /A "TrueRAM=MaxCapacity/(1<<20), StickSizes=TrueRAM/MemoryDevices"
echo Max RAM = %TrueRAM% GiB / %MemoryDevices% sticks @ %StickSizes% GiB