Batch file 如何用MB值替换文本文件中所有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

我需要读取一个文件并用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:!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工作完美!谢谢!