我正在开发一个应用程序。必须在整个项目中更改某条路径。路径是固定的,文件可以编辑(它在.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 ...
答案 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
来保留感叹号%
的问题:
祝你好运!
答案 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
个扩展名。当然,可以删除原始文件,以便新的文件替换它们。此外,可以实现对该文件的使用形式的任何修改;例如,在批处理文件参数中提供要替换的原始字符串和新字符串。