【问题标题】:Batch file change a drive letter string in a log file批处理文件更改日志文件中的驱动器号字符串
【发布时间】:2020-05-07 18:23:41
【问题描述】:

尝试使用批处理替换 Idrive 日志文件中的驱动器名称。多年来试图理解批处理文件的业余程序员,但仍然没有获得高级技术。我怀疑 '\' 反斜杠需要转义,但我没有尝试任何方法。

示例日志输入:

[C:\Users\rh56\Music\desktop.ini]
[D:\clients\]
[D:\Orion\]
[D:\rigel\]
[SUCCESS] [03/06/2020 5:02:19] [[Full Backup]  C:\stuff\2019-01-14 11_54_14-Cartoon Caption Contest _ The New Yorker.png][Size: 191.03 KB]]
[SUCCESS] [03/06/2020 5:02:19] [[Full Backup][C:\junk\2019-05-01 20_22_26-Greenshot.png][Size: 384.27 KB]]
[SUCCESS] [03/06/2020 5:02:20] [[Full Backup]C:\arbitrage\EuroYen30day\2019-05-01 20_23_06-Window.png][Size: 271.33 KB]]

期望的输出:(注意用 M:\ 代替 C:\ )

[M:\Users\rh56\Music\desktop.ini]
[D:\clients\]
[D:\Orion\]
[D:\rigel\]
[SUCCESS] [03/06/2020 5:02:19] [[Full Backup]  M:\stuff\2019-01-14 11_54_14-Cartoon Caption Contest _ The New Yorker.png][Size: 191.03 KB]]
[SUCCESS] [03/06/2020 5:02:19] [[Full Backup][M:\junk\2019-05-01 20_22_26-Greenshot.png][Size: 384.27 KB]]
[SUCCESS] [03/06/2020 5:02:20] [[Full Backup][M:\arbitrage\EuroYen30day\2019-05-01 20_23_06-Window.png][Size: 271.33 KB]]

我的代码:

  set vSearch=C:\\ & set vReplace=M:\\
  setlocal enableextensions disabledelayedexpansion
  ::https://stackoverflow.com/questions/23075953/batch-script-to-find-and-replace-a-string-in-text-file-without-creating-an-extra/23076141
echo. & echo DEBUG DEBUG DEBUG & pause & echo.
    set "vtextFile=C:\idriveLogChecker\molly.log"
    for /f "delims=" %%i in ('type "%vtextFile%" ^& break ^> "%vtextFile%" ') do (
        set "line=%%i"
        setlocal enabledelayedexpansion
        >>"%vtextFile%" echo(!line:%vSearch%=%vReplace%!
        endlocal
    )
echo. & echo DEBUG DEBUG DEBUG & pause & net use & set v & echo on & echo. & cmd /K

这一切看起来都非常复杂——有没有一些更简单的高度自动化的方法可以用最少的学习曲线来做到这一点?感谢您的帮助

【问题讨论】:

  • 如果您愿意使用第三方实用程序:jrepl.bat
  • type "%vtextFile%" |jrepl "C:\\" "M:\\" >newFile.txt - jrepl 使用正则表达式,所以 \ 是一个转义字符,它必须被转义(当然是转义字符 \)。或者更优雅一点:jrepl "C:\" "M:\" /f "%vtextFile%" /l /o -,用更改后的测试覆盖文件。

标签: batch-file string-substitution drive-letter


【解决方案1】:

您的代码对我来说很好 - 当我只更正一行时:

set "vSearch=C:\" & set "vReplace=M:\"

\ 没有被转义(另一个\ 无论如何都会出错。转义字符是^)更重要的是:您的原始行将第一个变量设置为C:\\<SPACE>,所以有没有什么可以更换的。

注意引号的位置 - 它们不会成为变量名称或值的一部分,但它是推荐的语法,可以避免杂散的空格,并且可以安全地抵御<>&| 等一些有毒字符。

【讨论】:

  • 感谢大家这么快。 Stephan,当我按照您的建议进行编辑时,字符串 'C:\' 被替换为空; '',例如 'C:\junk' 就变成了 'junk' 。可以引用任何代码并忽略引号吗?这对我来说没有意义,但在这一点上,我只想让它工作。令人沮丧!我有一种感觉 \\ 是不正确的,但从这个看起来不错的网站上得到了它; robvanderwoude.com/escapechars.php。还没有任何工作。 jrepl.bat 似乎同样古怪。我会尝试 FART,尽管我承认自己有点势利,我不喜欢它。 ::)
  • 糟糕!我今天早些时候根据斯蒂芬的评论/建议更正我的代码时犯了一个错字,现在它已经更正并且可以工作了!最后!谢谢斯蒂芬,将标记为已解决。我很欣赏解决方案和解释。
  • cmd 中永远不会忽略字符串周围的引号。 (set 是一种例外——它们不会被忽略,但也不是这种语法的字符串的一部分)。如果你想了解更多,给自己找一个安静的房间和一大罐咖啡(你会需要的)然后阅读this
  • 谢谢斯蒂芬,我在两段中读完了 4 罐,然后开始幻想一些更有趣的东西,比如有机化学,因为它适用于古希腊语使用者使用的成本会计。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多