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

时间:2013-06-28 16:03:07

标签: windows batch-file batch-processing

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

所以我认为我可以使用批处理文件将所有http://localhost.com更改为http://domain.com(我知道相对和绝对路径,但在这里我必须这样做。

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

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

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

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

2 个答案:

答案 0 :(得分:5)

您可以使用GNU Win32 sed

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

for /r循环以递归方式搜索所有文件夹,sed更改所有*.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

工作原理:

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

使用过的变量:

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

优点:

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

的问题:

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

祝你好运!

答案 1 :(得分:1)

下面的混合Batch-JScript文件可以比任何纯Batch解决方案更快地解决您的问题。别担心!这是批处理.BAT解决方案,因此您无需安装任何内容即可在任何使用Windows XP或后续版本的计算机上运行它。

@if (@CodeSection == @Batch) @then

@echo off
for /R "\MyApp\Views" %%a in (*.cshtml) do (
   < "%%a" CScript //nologo //E:JScript "%~F0" > "%%a.repl"
)
goto :EOF

@end

// JScript section

WScript.Stdout.Write(WScript.StdIn.ReadAll().replace(/http:\/\/localhost\.com/g,"http://domain.com"));

以前的程序会生成输入文件,其输入文件的名称相同,另外还有.repl个扩展名。当然,可以删除原始文件,以便新的文件替换它们。此外,可以实现对该文件的使用形式的任何修改;例如,在批处理文件参数中提供要替换的原始字符串和新字符串。