【问题标题】:Powershell Replace Variable in StringPowershell替换字符串中的变量
【发布时间】:2014-09-15 13:01:38
【问题描述】:

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

要替换的行:

<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";

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

【问题讨论】:

  • 按照目前的情况,您编写的用于替换的代码是什么?
  • 我已经编辑了帖子。见上文

标签: powershell sitecore sitecore-rocks


【解决方案1】:

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

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

$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

【讨论】:

  • 我正在尝试使用 \n 或 \r 添加新行,但它不起作用。你知道我怎么添加它吗?
  • 检查中...我没有注意到你试图在那里打破界限。
  • 您实际上不需要使用换行符,只需在单独的行中输入并用单引号括起开头和结尾..将更新答案。
  • Thnx,这确实有效,所包含的空间也有效。
【解决方案2】:

尝试结合使用 here-strings 和 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";

【讨论】:

  • 当我在文件中有一行时它可以工作,但是当我得到更多像 2 行时它不起作用。我收到错误:方法调用失败,因为 [System.Object[]] 不包含名为“replace”的方法。
  • 编辑答案,再试一次。
【解决方案3】:

如果可以试试这个

 $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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-20
    • 2021-10-31
    • 1970-01-01
    • 2021-10-09
    • 2021-05-13
    • 2020-02-04
    • 1970-01-01
    相关资源
    最近更新 更多