3

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

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

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

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

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

我的应用
我的应用程序/视图
MyApp/Views/Index/page1.cshtml
MyApp/Views/Index/page2.cshtml
MyApp/Views/Another/page7.cshtml
...
4

2 回答 2

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文件中的 URL。它还制作备份副本*.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循环:递归读取startfolder的目录,将文件名依次放入一个变量中,并为每个文件调用一个子程序process
  • 第二个for循环:逐行读取文件,使用findstr保存空行。如果出现,则全部替换http://localhost.comhttp://domain.com并将这些行写入新文件。

使用的变量:

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

好处:

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

问题:

  • Windows 命令外壳语言(WCSL,又名“批处理”)不能处理长度超过8191 个字符的行,对于 HTML 内容来说则不然
  • 好吧,批处理不是赛车,取决于您的内容量,这可能是名副其实的一夜之间的工作

祝你好运!

于 2013-06-28T16:43:39.323 回答
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扩展名。当然,可以删除原始文件,如果您愿意,可以使用新文件替换它们。此外,可以对这个文件的使用形式进行任何修改;例如,在批处理文件参数中给出用于替换的原始字符串和新字符串。

于 2013-07-02T16:43:56.407 回答