Batch file 如何用MB值替换文本文件中所有GB值?
我需要读取一个文件并用MB值替换GB值。该值并不总是以GB为单位,大多数情况下是十进制。我找到的唯一方法是:Batch file 如何用MB值替换文本文件中所有GB值?,batch-file,Batch File,我需要读取一个文件并用MB值替换GB值。该值并不总是以GB为单位,大多数情况下是十进制。我找到的唯一方法是: for /F "tokens=1,2,3,4 delims=," %%A in (file.log) do ( echo.%%D|findstr "GB Available" >nul 2>&1 if errorlevel 0 if not errorlevel 1 ( set value=%%D echo value
for /F "tokens=1,2,3,4 delims=," %%A in (file.log) do (
echo.%%D|findstr "GB Available" >nul 2>&1
if errorlevel 0 if not errorlevel 1 (
set value=%%D
echo value:!value! REM looks like "Available= 12.53GB"
set value_short=!value:~11!
set value_short=!value_short: GB=! REM looks like "12.53"
echo value_short:!value_short!
set /a value_converted=!value_short:.=!*10
echo value_converted:!value_converted! MB REM looks like "1253 MB"
set "line=%%D"
set "line=!line: !value_short!=!value_converted!!"
echo LINE: !line! REM Need to have something like: "Available= 1253MB"
)
if errorlevel 1 (
echo no
)
)
不幸的是设置“line=!line:!value\u short!=!value\u converted!!”
不起作用,我也尝试了用%代替!但它不起作用。这条线怎么了
主要目标是在我的文件中有以MB为单位的值,为此,我读取文件并以MB为单位写入行,而不在新文件中触碰它们,然后通过转换以GB为单位重新写入行。如果你有一个更简单的方法,这是非常欢迎 假设GB值始终有两位小数,并且值单位使用1000的倍数,而不是1024的倍数。我将假定这是正确的 使用
&&
(成功)和| |
(失败)运算符有一个更简单的条件执行表示法
您的FINDSTR搜索不正确。它将匹配任何包含GB
或可用的行。您需要的是和。我将使用正则表达式搜索“^Available=.*GB$”
您的评论声称源值为12.53GB
,但您的代码暗示它为12.53GB
。我将假设您的代码是正确的,并且在GB之前有一个空格。您的代码还假定数字前始终有空格。我还要假设这是正确的
您的失败行需要两层变量扩展。搜索和替换项必须在外部变量展开之前展开<代码>%var%
如果您不在代码块中,那么它可以工作,但是您在代码块中,所以它不会工作。解决方案是将值传递到FOR变量
for %%A in ("!value_short!") do for %%B in ("!value_converted!") do set "line=!line:%%~A=%%~B!"
如果其中一个值包含*
或?
,则必须切换到使用带有(“字符串”)
值的FOR/F
但是有一个更简单的方法来完成你的任务
for /F "tokens=1-4 delims=," %%A in (file.log) do (
for /f "tokens=1-4 delims=. " %%a in ("%%D") do if "%%a"=="Available=" if "%%d"=="GB" (
set "line=%%a %%b%%c0 MB"
echo !line!
) else (
echo no
)
)
以上内容只修复了现有代码-它不会替换原始文件中的任何值
我不会使用上述任何纯批处理来修改该文件。相反,我将使用它在stdin上执行正则表达式搜索/替换,并将结果写入stdout。这是一个纯脚本,从XP开始将在任何Windows机器上本机运行
type "file.log" | repl "(Available= )([0-9]+)\.([0-9][0-9]) GB" "$1$2$30 MB" >"file.log.new"
move /y "file.log.new" "file.log" >nul
您的MB转换在最后2条备注中出错。应该是12530分钟你的空间是对的,只是一个打字错误!我尝试了“^Available=.*GB$”正则表达式,但没有成功。然而,你的REPL.BAT工作完美!谢谢!