Batch file 搜索所有数字字符串并除法
我有一个Batch file 搜索所有数字字符串并除法,batch-file,for-loop,Batch File,For Loop,我有一个Output.txt文件,其中包含以下内容: Server1 APPNAME MEMORY WINDOWS 54896378 LINUX 78542 MACOS 187963 Server2 APPNAME MEMORY DATABASE 587412369 SCHEMA 78542 TABLESPACE 187963 我想创建一个批处理脚本,搜索Output.txt中的所有数值(如548963787854278542等),然后将它们除以10
Output.txt
文件,其中包含以下内容:
Server1
APPNAME MEMORY
WINDOWS 54896378
LINUX 78542
MACOS 187963
Server2
APPNAME MEMORY
DATABASE 587412369
SCHEMA 78542
TABLESPACE 187963
我想创建一个批处理脚本,搜索Output.txt中的所有数值(如548963787854278542等),然后将它们除以1024*1024,这样Newoutput.txt文件中的内存(字节)就可以变成MB
我在下面尝试了,但没有得到我想要的:
@echo off
setlocal enabledelayedexpansion
for /F "delims= " %%a in ('findstr "[1-9][0-9]* 0"' Output.txt) do (
SET /A Result = %a / 1024*1024 > Newoutput.txt
)
EDIT1:
当Output.txt
文件包含以下内容时,一切正常,但脚本未仅转换FreePhysicalMemory
值6621212,即:
Output.txt:
Server1
APPNAME MEMORY
WINDOWS 54896378
LINUX 78542
MACOS 187963
FreePhysicalMemory TotalVisibleMemorySize
6621212 8387172
Newoutput.txt:
Server1
APPNAME MEMORY
WINDOWS 13.58
LINUX 2.45
MACOS 1.8
FreePhysicalMemory TotalVisibleMemorySize
6621212 21.4
我们需要在脚本中进行哪些更改
SET /A Result = %a / 1024*1024
这将%a除以1024,并将输出乘以1024。这不是你想要的。
正确的划分应为:
SET /A Result = %a / 1024 / 1024
或者您可以预先计算1024*1024=1048576和
SET /A Result = %a / 1048576
这将%a除以1024,并将输出乘以1024。这不是你想要的。
正确的划分应为:
SET /A Result = %a / 1024 / 1024
或者您可以预先计算1024*1024=1048576和
SET /A Result = %a / 1048576
请注意,批处理仅适用于整数。您的一些计算结果将得出0 MBs的值。下面是一个如何使用十进制值的粗略示例
@echo off
call :Parse > Newoutput.txt
exit /b 0
:Parse
for /f "tokens=1,2" %%A in (Output.txt) do call :ToMB "%%~B" "%%~A" || echo(%%A %%B
exit /b 0
:IsNumber <String>
for /f "delims=0123456789" %%A in ("%~1") do exit /b 1
exit /b 0
:ToMB <String> <Name>
setlocal
call :IsNumber "%~1" || exit /b 1
set "Number=%~1"
set /a "Number/=1024"
set /a "Decimal=Number"
set /a "Number/=1024"
set /a "Decimal-=(Number * 1024)"
set /a "Decimal=(Decimal * 1000) / 1024"
set "Decimal=000%Decimal%"
set "Number= %Number%"
set "Name=%~2 "
echo %Name:~0,12%%Number:~-3%.%Decimal:~-3%
endlocal
exit /b 0
@echo关闭
调用:Parse>Newoutput.txt
退出/b0
:解析
对于(Output.txt)中的/f“tokens=1,2”%%%A,请执行以下调用:坟墓“%%~B”“%%~A”| |回音(%%A%%B
退出/b0
:IsNumber
对于(“%1”)中的/f“delims=0123456789”%%A,请退出/b 1
退出/b0
:坟墓
setlocal
呼叫:IsNumber“%~1”| |退出/b 1
设置“数字=%~1”
设置/a“数字/=1024”
设置/a“十进制=数字”
设置/a“数字/=1024”
设置/a“十进制-=(数字*1024)”
设置/a“十进制=(十进制*1000)/1024”
设置“十进制=000%十进制%”
设置“Number=%Number%”
设置“名称=%~2”
回音%Name:~0,12%%数字:~-3%。%Decimal:~-3%
端部
退出/b0
- 更新:将AppName和一些格式添加到输出中。(如上)
- 更新:添加了Newoutput.txt重定向示例。(如上)
- 更新:增加了对所有令牌的转换支持,并改进了格式。(如下)
- 更新:为find命令添加了第一行跳过修复。(如下)
@echo关闭
调用:Parse>Newoutput.txt
退出/b0
:解析
setlocal
对于/f“tokens=1,*delims=]”中的%%A('type“Output.txt”^ | find/n/v“”)do(
对于“%$B”中的/f“令牌=1,2”%%X,请执行以下操作:转换“%%~X”%%~Y”
调用:空白“%%~B”
)
端部
退出/b0
:空白
设置“字符串=%~1”
如果未定义字符串回显。
退出/b0
:IsNumber
对于(“%1”)中的/f“delims=0123456789”%%A,请退出/b 1
如果“%~1”==”退出/b 2
退出/b0
:转换
调用:计算“%~1”Y | |调用:显示“%~1”Y
调用:计算“%~2”|调用:显示“%~2”
回声。
退出/b0
:计算[Pad]
呼叫:IsNumber“%~1”| |退出/b 1
设置“数字=%~1”
设置/a“数字/=1024”
设置/a“十进制=数字”
设置/a“数字/=1024”
设置/a“十进制-=(数字*1024)”
设置/a“十进制=(十进制*1000)/1024”
设置“十进制=000%十进制%”
设置“编号=000%编号%”
呼叫:显示“%Number:~-3%。%Decimal:~-3%”%2
退出/b0
:显示[键盘]
设置“字符串=%~1”
设置“Pad=%~2”
如果已定义,请设置“字符串=%String%”
如果定义了字符串集/p“=%String:~0,24%”,请注意,批处理仅适用于整数。您的一些计算将导致0 MBs的值。下面是一个如何使用十进制值的粗略示例
@echo off
call :Parse > Newoutput.txt
exit /b 0
:Parse
for /f "tokens=1,2" %%A in (Output.txt) do call :ToMB "%%~B" "%%~A" || echo(%%A %%B
exit /b 0
:IsNumber <String>
for /f "delims=0123456789" %%A in ("%~1") do exit /b 1
exit /b 0
:ToMB <String> <Name>
setlocal
call :IsNumber "%~1" || exit /b 1
set "Number=%~1"
set /a "Number/=1024"
set /a "Decimal=Number"
set /a "Number/=1024"
set /a "Decimal-=(Number * 1024)"
set /a "Decimal=(Decimal * 1000) / 1024"
set "Decimal=000%Decimal%"
set "Number= %Number%"
set "Name=%~2 "
echo %Name:~0,12%%Number:~-3%.%Decimal:~-3%
endlocal
exit /b 0
@echo关闭
调用:Parse>Newoutput.txt
退出/b0
:解析
对于(Output.txt)中的/f“tokens=1,2”%%%A,请执行以下调用:坟墓“%%~B”“%%~A”| |回音(%%A%%B
退出/b0
:IsNumber
对于(“%1”)中的/f“delims=0123456789”%%A,请退出/b 1
退出/b0
:坟墓
setlocal
呼叫:IsNumber“%~1”| |退出/b 1
设置“数字=%~1”
设置/a“数字/=1024”
设置/a“十进制=数字”
设置/a“数字/=1024”
设置/a“十进制-=(数字*1024)”
设置/a“十进制=(十进制*1000)/1024”
设置“十进制=000%十进制%”
设置“Number=%Number%”
设置“名称=%~2”
回音%Name:~0,12%%数字:~-3%。%Decimal:~-3%
端部
退出/b0
- 更新:将AppName和一些格式添加到输出中。(如上)
- 更新:添加了Newoutput.txt重定向示例。(如上)
- 更新:增加了对所有令牌的转换支持,并改进了格式。(如下)
- 更新:为find命令添加了第一行跳过修复。(如下)
@echo关闭
调用:Parse>Newoutput.txt
退出/b0
:解析
setlocal
对于/f“tokens=1,*delims=]”中的%%A('type“Output.txt”^ | find/n/v“”)do(
对于“%$B”中的/f“令牌=1,2”%%X,请执行以下操作:转换“%%~X”%%~Y”
调用:空白“%%~B”
)
端部
退出/b0
:空白
设置“字符串=%~1”
如果未定义字符串回显。
退出/b0
:IsNumber
对于(“%1”)中的/f“delims=0123456789”%%A,请退出/b 1
如果“%~1”==”退出/b 2
退出/b0
:转换
调用:计算“%~1”Y | |调用:显示“%~1”Y
调用:计算“%~2”|调用:显示“%~2”
回声。
退出/b0
:计算[Pad]
呼叫:IsNumber“%~1”| |退出/b 1
设置“数字=%~1”
设置/a“数字/=1024”
设置/a“十进制=数字”
设置/a“数字/=1024”
设置/a“十进制-=(数字*1024)”
设置/a“十进制=(十进制*1000)/1024”
设置“十进制=000%十进制%”
设置“编号=000%编号%”
呼叫:显示“%Number:~-3%。%Decimal:~-3%”%2
退出/b0
:显示[键盘]
设置“字符串=%~1”
设置“Pad=%~2”
如果已定义,请设置“字符串=%String%”
如果定义了字符串集/p“=%String:~0,24%”首先,您不会将任何内容写入新文件。此外,您也不会对获得的结果执行任何操作。批处理数学的最高值为2^31-1,因此无法处理2GB或更高的值。您不会将任何内容写入新文件。此外,您也不会对获得的结果执行任何操作。批处理数学最高值为在2^31-1处退出,因此您无法使用它处理2GB或更高的值。Stephan..我根据您的建议修改并尝试了我的代码..但不知道为什么它不起作用。Stephan..我根据您的建议修改并尝试了我的代码..但不知道为什么它不起作用。谢谢。David..它作为一名ch