sta*_*ser 4 powershell powershell-2.0
我正在尝试使用PowerShell替换文件中的一大块文本.例如,我有一个.sql文件,我知道需要在该特定文件中替换的sql脚本的确切块.在阅读了一些powershell替换示例之后,看起来PowerShell会返回数组中文件的内容(每行代表数组中的一个条目).
例如:
GO
:on error exit
GO
IF (DB_ID(N'$(DatabaseName)') IS NOT NULL)
BEGIN
ALTER DATABASE [$(DatabaseName)]
SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
DROP DATABASE [$(DatabaseName)];
END
GO
PRINT N'Creating $(DatabaseName)...'
GO
CREATE DATABASE [$(DatabaseName)] COLLATE SQL_Latin1_General_CP1_CI_AS
GO
USE [$(DatabaseName)]
.......
.........
..... MORE SQL SCRIPT
Run Code Online (Sandbox Code Playgroud)
我想在上面的文件中将文本替换为USE [$(DatabaseName)].
谢谢.
这是我将如何做到这一点.首先,当您需要获取文件的全部内容时,例如将文本替换为多行,请跳过使用Get-Content,[IO.file]::ReadAllText()改为使用.然后使用-replace运算符,例如:
[IO.File]::ReadAllText("$pwd\foo.sql") -replace `
'(?s).*?(USE \[\$\(DatabaseName\)\].*)$',"foo`n`$1" > foo.sql
Run Code Online (Sandbox Code Playgroud)
在这里,我用"foo"替换开头的文本.另请注意,为了使用正则表达式-replace匹配新行,我在正则表达式前加上(?s)- singeline模式.
Mjolinor带来了一个好点的,在替换文本有可能被解释为正则表达式特殊变量字符的情况下例如$1,$2等等.虽然你可以使用[regex]::escape()逃脱正则表达式仍有PowerShell中,将解释$<something>为变量或一个启动子的表达.在这种情况下,通过捕获要与-replace运算符保持的部分然后在第二步中添加新文本来解决这个问题非常简单,例如:
$keep = [IO.File]::ReadAllText("$pwd\foo.sql") -replace `
'(?s).*?(USE \[\$\(DatabaseName\)\].*)$','$1'
$newText + $keep > foo.sql
Run Code Online (Sandbox Code Playgroud)
请注意,在这种情况下的替换中,我使用单引号来$1阻止PowerShell解释任何特殊的PowerShell字符.它有点像C#中的逐字字符串.
| 归档时间: |
|
| 查看次数: |
6968 次 |
| 最近记录: |