0

我在一个包含 $ 字符的配置文件中有一个字符串。
我想替换此行,但 powershell 将其识别为变量。
我做了一些研究,发现“”=变量和''=正则表达式。
并且使用反引号 ` 应该可以工作,但我无法让它工作。

要替换的行:

<remove folder="$(dataFolder)/logs" pattern="log.*.txt" maxCount="20" minAge="7.00:00:00" />

替换为:

<remove folder="$(dataFolder)/logs" pattern="log.*.txt" maxCount="20" minAge="7.00:00:00"/>\n          <remove folder="$(dataFolder)/logs" pattern="WebDAV.log.*.txt" maxCount="20" minAge="7.00:00:00" />

我目前拥有的:

$replace = '<remove folder="$(dataFolder)/logs" pattern="log.*.txt" maxCount="20" minAge="7.00:00:00"/>';
$with = ('<remove folder="$(dataFolder)/logs" pattern="log.*.txt" maxCount="20"    minAge="7.00:00:00"/>\n          <remove folder="$(dataFolder)/logs" pattern="WebDAV.log.*.txt" maxCount="20" minAge="7.00:00:00" />');
(Get-Content $webConfigFileName) -replace $replace,$with | Set-Content $webConfigFileName;
Write-Output "Replaced '$replace' with '$with' in $webConfigFileName";

有人可以帮我解决这个问题吗?

4

3 回答 3

3

在大多数情况下,您可以使用单引号将其中的所有内容视为文字,而不是解释变量等内容。在某些情况下,多个嵌套引号可能会出现问题,在这种情况下,您需要开始转义或使用此处的字符串,但在这种情况下,它不是必需的。

实际上,您需要在匹配语句中为几个不同的区域使用正则表达式转义以使其正常工作,然后将所有内容用单引号括起来以使其起作用。

$1 = '<remove folder="$(dataFolder)/logs" pattern="log.*.txt" maxCount="20" minAge="7.00:00:00" />'
$REGEX = '<remove folder="\$\(dataFolder\)\/logs" pattern="log\.\*\.txt" maxCount="20" minAge="7\.00:00:00" \/>'
$1 -replace $regex,'test'

编辑:您要替换的 txt 也可以用单引号括起来,它会起作用,如下所示:

$1=gc C:\test.txt
$REGEX = '<remove folder="\$\(dataFolder\)\/logs" pattern="log\.\*\.txt" maxCount="20" minAge="7\.00:00:00" \/>'
$replace = '<remove folder="$(dataFolder)/logs" pattern="log.*.txt" maxCount="20" minAge="7.00:00:00"/>          
<remove folder="$(dataFolder)/logs" pattern="WebDAV.log.*.txt" maxCount="20" minAge="7.00:00:00" />'
$1 -replace $regex,$replace | set-content c:\test.txt
于 2014-09-15T13:33:33.417 回答
2

尝试使用这里字符串和Replace方法的组合:

$with = @"
<remove folder="`$(dataFolder)/logs" pattern="log.*.txt" maxCount="20" minAge="7.00:00:00" />
<remove folder="`$(dataFolder)/logs" pattern="WebDAV.log.*.txt" maxCount="20" minAge="7.00:00:00" />
"@

$replace = @"
<remove folder="`$(dataFolder)/logs" pattern="log.*.txt" maxCount="20" minAge="7.00:00:00" />
"@

(Get-Content $webConfigFileName).replace($replace,$with) | Out-String | Set-Content $webConfigFileName;

Write-Output "Replaced '$replace' with '$with' in $webConfigFileName";
于 2014-09-15T13:34:17.610 回答
0

如果工作,试试这个

 $repl ='(<remove folder="\$\(dataFolder\)/logs" pattern=")((?:log)\.\*\.txt)(" maxCount="20" minAge="7.00:00:00" \/>)'

(Cat $webConfigFileName) -replace $repl,"`$0`n`t`$1WebDAV.`$2`$3"| Set-Content $webConfigFileName;
于 2014-09-15T13:38:44.287 回答