批处理:在保存到变量之前截断字符串
Batch: Truncate String before saving to variable
也许这是一个简单的问题。我想制作一个小的批处理脚本来输出已安装、已使用和可用的 RAM。用过的RAM没问题,我就用
for /f "skip=1" %%a in ('wmic os get freephysicalmemory') do (
它以 MB 为单位输出空闲 RAM。但是当我使用
for /f "skip=1" %%p in ('wmic computersystem get totalphysicalmemory') do (
它以 kB 为单位输出总 RAM,这会创建一个 > 32 位的字符串,在我的例子中是 8441917440。有没有办法在将它保存到变量之前截断它?就像切断最后三位或六位数字一样?不然我就没办法用它来计算了
谢谢!!
您可以使用 PowerShell 对大于 32 位的数字进行数学运算。
@echo off
setlocal enabledelayedexpansion
:: Get free physical memory, measured in KB
for /f "tokens=2 delims==" %%A in ('wmic os get freephysicalmemory /value ^| find "="') do set free_physical_memory_kb=%%A
:: Get total physical memory, measured in B
for /f "tokens=2 delims==" %%A in ('wmic computersystem get totalphysicalmemory /value ^| find "="') do set total_physical_memory_b=%%A
:: Batch can't do math with numbers larger than 429496728, but PowerShell can
:: The huge number can still be stored in a batch variable because it gets treated
:: as a string until calculations are done with it
for /f %%A in ('powershell !total_physical_memory_b!/1024') do set total_physical_memory_kb=%%A
:: Convert the KB variables to MB
:: Batch can only do integer math, so the numbers will be rounded down
set /a free_physical_memory_mb=%free_physical_memory_kb%/1024
set /a total_physical_memory_mb=%total_physical_memory_kb%/1024
:: Get the percentage available (again, using PowerShell because batch can only do integer math)
for /f %%A in ('powershell !free_physical_memory_mb!/!total_physical_memory_mb!*100') do set free_percent=%%A
echo Free memory: %free_physical_memory_mb% MB
echo Total memory: %total_physical_memory_mb% MB
echo Percentage free: %free_percent%%%
pause
删除最后 3 (6) 位数字很容易,如果您可以接受增量:
set x=8441917440
echo cut last 3 digits: %x:~0,-3%
echo cut last 6 digits: %x:~0,-6%
REM or to cut it in the variable:
set x=%x:~0,-6%
echo cut last 6 digits: %x%
这是一个脚本,它在一次调用 PowerShell 中执行所有计算:
@echo off
setlocal
:: Get free physical memory, measured in KB
for /f "skip=1" %%A in ('wmic os get freephysicalmemory') do for %%B in (%%A) do set free_KB=%%B
:: Get total physical memory, measured in B
for /f "skip=1" %%A in ('wmic computersystem get totalphysicalmemory') do for %%B in (%%A) do set total_B=%%B
:: Compute values in MB
for /f "tokens=1-3" %%A in (
'powershell -command "& {[int]$total=%total_B%/1MB;[int]$free=%free_KB%/1KB;$used=$total-$free;echo $total' '$used' '$free}"'
) do (
set total_MB=%%A
set used_MB=%%B
set free_MB=%%C
)
:: Print the results
echo Total: %total_MB% MB
echo Used: %used_MB% MB
echo Free: %free_MB% MB
批处理和 PowerShell 之间的上下文切换相当慢。使用 hybrid batch/JScript.
速度更快
我写了一个hybrid JScript/batch utility called JEVAL.BAT that makes it convenient to incorporate JScript within any batch file.
以下脚本使用 JEVAL.BAT 的速度大约是使用 PowerShell 的两倍:
@echo off
setlocal
:: Get free physical memory, measured in KB
for /f "skip=1" %%A in ('wmic os get freephysicalmemory') do for %%B in (%%A) do set free_KB=%%B
:: Get total physical memory, measured in B
for /f "skip=1" %%A in ('wmic computersystem get totalphysicalmemory') do for %%B in (%%A) do set total_B=%%B
:: Compute values in MB
for /f "tokens=1-3" %%A in (
'jeval "total=Math.round(%total_B%/1024/1024);free=Math.round(%free_KB%/1024);total+' '+(total-free)+' '+free"'
) do (
set total_MB=%%A
set used_MB=%%B
set free_MB=%%C
)
:: Print the results
echo Total: %total_MB% MB
echo Used: %used_MB% MB
echo Free: %free_MB% MB
也许这是一个简单的问题。我想制作一个小的批处理脚本来输出已安装、已使用和可用的 RAM。用过的RAM没问题,我就用
for /f "skip=1" %%a in ('wmic os get freephysicalmemory') do (
它以 MB 为单位输出空闲 RAM。但是当我使用
for /f "skip=1" %%p in ('wmic computersystem get totalphysicalmemory') do (
它以 kB 为单位输出总 RAM,这会创建一个 > 32 位的字符串,在我的例子中是 8441917440。有没有办法在将它保存到变量之前截断它?就像切断最后三位或六位数字一样?不然我就没办法用它来计算了
谢谢!!
您可以使用 PowerShell 对大于 32 位的数字进行数学运算。
@echo off
setlocal enabledelayedexpansion
:: Get free physical memory, measured in KB
for /f "tokens=2 delims==" %%A in ('wmic os get freephysicalmemory /value ^| find "="') do set free_physical_memory_kb=%%A
:: Get total physical memory, measured in B
for /f "tokens=2 delims==" %%A in ('wmic computersystem get totalphysicalmemory /value ^| find "="') do set total_physical_memory_b=%%A
:: Batch can't do math with numbers larger than 429496728, but PowerShell can
:: The huge number can still be stored in a batch variable because it gets treated
:: as a string until calculations are done with it
for /f %%A in ('powershell !total_physical_memory_b!/1024') do set total_physical_memory_kb=%%A
:: Convert the KB variables to MB
:: Batch can only do integer math, so the numbers will be rounded down
set /a free_physical_memory_mb=%free_physical_memory_kb%/1024
set /a total_physical_memory_mb=%total_physical_memory_kb%/1024
:: Get the percentage available (again, using PowerShell because batch can only do integer math)
for /f %%A in ('powershell !free_physical_memory_mb!/!total_physical_memory_mb!*100') do set free_percent=%%A
echo Free memory: %free_physical_memory_mb% MB
echo Total memory: %total_physical_memory_mb% MB
echo Percentage free: %free_percent%%%
pause
删除最后 3 (6) 位数字很容易,如果您可以接受增量:
set x=8441917440
echo cut last 3 digits: %x:~0,-3%
echo cut last 6 digits: %x:~0,-6%
REM or to cut it in the variable:
set x=%x:~0,-6%
echo cut last 6 digits: %x%
这是一个脚本,它在一次调用 PowerShell 中执行所有计算:
@echo off
setlocal
:: Get free physical memory, measured in KB
for /f "skip=1" %%A in ('wmic os get freephysicalmemory') do for %%B in (%%A) do set free_KB=%%B
:: Get total physical memory, measured in B
for /f "skip=1" %%A in ('wmic computersystem get totalphysicalmemory') do for %%B in (%%A) do set total_B=%%B
:: Compute values in MB
for /f "tokens=1-3" %%A in (
'powershell -command "& {[int]$total=%total_B%/1MB;[int]$free=%free_KB%/1KB;$used=$total-$free;echo $total' '$used' '$free}"'
) do (
set total_MB=%%A
set used_MB=%%B
set free_MB=%%C
)
:: Print the results
echo Total: %total_MB% MB
echo Used: %used_MB% MB
echo Free: %free_MB% MB
批处理和 PowerShell 之间的上下文切换相当慢。使用 hybrid batch/JScript.
速度更快我写了一个hybrid JScript/batch utility called JEVAL.BAT that makes it convenient to incorporate JScript within any batch file.
以下脚本使用 JEVAL.BAT 的速度大约是使用 PowerShell 的两倍:
@echo off
setlocal
:: Get free physical memory, measured in KB
for /f "skip=1" %%A in ('wmic os get freephysicalmemory') do for %%B in (%%A) do set free_KB=%%B
:: Get total physical memory, measured in B
for /f "skip=1" %%A in ('wmic computersystem get totalphysicalmemory') do for %%B in (%%A) do set total_B=%%B
:: Compute values in MB
for /f "tokens=1-3" %%A in (
'jeval "total=Math.round(%total_B%/1024/1024);free=Math.round(%free_KB%/1024);total+' '+(total-free)+' '+free"'
) do (
set total_MB=%%A
set used_MB=%%B
set free_MB=%%C
)
:: Print the results
echo Total: %total_MB% MB
echo Used: %used_MB% MB
echo Free: %free_MB% MB