如何使用批处理更改项目中的特定字符串

cle*_*ent 3 windows batch-file batch-processing

我正在开发一个应用程序.必须在整个项目中更改某条路径.路径是固定的,文件可以编辑(它在.cshtml).

因此,我认为我可以使用一个批处理文件来改变所有的http://localhost.comhttp://domain.com例如(我知道的相对和绝对路径,但在这里我不得不做出这样的.

我想在许多计算机上使用这个脚本,所以我不想安装应用程序并将该应用程序与脚本一起使用...只需运行.bat即可...

因此,如果你有可以在文件中进行更改的代码,那就太棒了!

要完成我的问题,这里是文件和目录的路径

MyApp
MyApp/Views
MyApp/Views/Index/page1.cshtml
MyApp/Views/Index/page2.cshtml
MyApp/Views/Another/page7.cshtml
...

End*_*oro 5

您可以使用GNU Win32 sed:

for /r "MyApp/Views" %%a in (*.cshtml) do sed -ibak "s#http://localhost\.com#http://domain.com#g" "%%~a"
Run Code Online (Sandbox Code Playgroud)

for /r循环递归搜索所有的文件夹和sed改变的URL中的所有*.cshtml文件.它还制作备份副本*.bak.


批量安全性要小得多,但如果你愿意 - 这是我的批量建议:

@echo OFF &SETLOCAL
SET "fpath=MyApp\Views"
SET "newext=.new"

SET "fname="
for /r "%fpath%" %%a in (*.cshtml) DO SET "fname=%%~a"&CALL:process
goto:eof

:process
(FOR /f "delims=" %%b IN ('findstr /n "^" "%fname%"') DO (
    SET "line=%%b"
    SETLOCAL ENABLEDELAYEDEXPANSION
    SET "line=!line:*:=!"
    IF "!line:http://localhost.com=!" neq "!line!" (
        SET "line=!line:http://localhost.com=http://domain.com!"
    )
    ECHO(!line!
    ENDLOCAL
))>"%fname%%newext%"
goto:eof
Run Code Online (Sandbox Code Playgroud)

这个怎么运作:

  • 第一个for循环:递归读取起始文件夹的目录,将文件名连续放入变量中,并process 为每个文件调用子例程.
  • 第二个for循环:逐行读取文件,findstr用于保留空行.将all替换http://localhost.comhttp://domain.com如果出现并将行写入新文件.

使用的变量:

  • %fpath% 要处理的文件的路径,默认 MyApp\Views
  • %newext% 新文件的扩展名,默认 .new

优点:

  • 保留空行 findstr
  • 通过delayed expansion第二个for 循环中的toggeling 来保留感叹号
  • %通过使用全局变量保留文件名中的百分号

问题:

  • Windows命令外壳语言(WCSL,又名"批处理")不能处理长度超过8191个字符的行,而不能处理HTML内容
  • 好吧,批次不是赛车,并且取决于你的内容量,这可能是一个真正的一夜之间的工作

祝好运!