Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 搜索所有数字字符串并除法_Batch File_For Loop - Fatal编程技术网

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