试图替换文件中的字符串,但它取代了太多

时间:2016-04-07 22:22:26

标签: string powershell powershell-v2.0 powershell-v3.0

我正在尝试整理PowerShell脚本以运行txt日志文件并删除域名/网址。

到目前为止,我只是在对文件进行查找替换,但是当我尝试这种方式时,它并没有按照我的预期工作。

如果我有一个包含以下内容的文本文件:

  

intranet.contoso.com和一些文字

运行我的脚本以用DOMAIN1替换intranet.contoso.com之后我会得到的输出是

  

DOMAIN1 DOMAIN1aDOMAIN1nDOMAIN1DDOMAIN1 DOMAIN1sDOMAIN1oDOMAIN1mDOMAIN1eDOMAIN1 DOMAIN1tDOMAIN1eDOMAIN1xDOMAIN1tDOMAIN1

所以我不确定我哪里出错了。到目前为止,我的代码是

$domains = ,("mydomain.net","mydomain"),("yourdomain.net","yourdomain"),("mydomain2.net","mydomain2")
$path = Read-Host "Please enter the full path to the directory containing the files to be sanatized"

    $files = Get-ChildItem –Path $path *.txt
    foreach ($file in $files)
    {
        for($x=0; $x -lt $domains.Count; $x++)
        {
            (Get-Content $file.PSPath) |
            Foreach-Object { $_ -replace $domains[$x][0], "DOMAIN$($x+1)" } |
            Set-Content $file.PSPath

            (Get-Content $file.PSPath) |
            Foreach-Object { $_ -replace $domains[$x][1], "DOMAIN$($x+1)" } |
            Set-Content $file.PSPath

        }
    }

3 个答案:

答案 0 :(得分:3)

我确定您的主要问题是在定义$domains时使用unary operator。如果你看看你的第一个元素。

PS D:\temp> $domains[0]
mydomain.net
mydomain

您可能会有所期待,但这是问题发生的下一步。让我们尝试一下" mydomain"串

PS D:\temp> $domains[0][1]

没有什么?这很奇怪。如果你知道发生了什么事,那不是真的。让我们看看这个锯齿状数组的另一个元素。

PS D:\temp> $domains[0][0]
mydomain.net
mydomain

这是什么废话?数组第一个元素的第一个元素是另一个数组。现在看这个:

PS D:\temp> $domains[0][0][1]
mydomain

我们试图获得几个步骤前的元素。你创建了一个数组,其中第一个元素是一个包含两个元素数组的数组。

您的测试文件看起来像它的方式是第一个示例尝试使用$domains[0][1],它将为null并匹配字符之间的每个空格,因此输出。

简单删除一元运算符。

$domains = ("mydomain.net","mydomain"),("yourdomain.net","yourdomain"),("mydomain2.net","mydomain2")

另外值得注意的是-replace是一个正则表达式运算符,因此您需要小心使用匹配字符串中的元字符。期间例如。静态正则表达式方法转义可以解决此问题,以确保您的字符串字面匹配。

$_ -replace [regex]::Escape($domains[$x][1]), "DOMAIN$($x+1)"

您还可以在知道-replace也是数组运算符的情况下改进替换逻辑。所以在你的循环中你可以替换这个

(Get-Content $file.PSPath) |
Foreach-Object { $_ -replace $domains[$x][0], "DOMAIN$($x+1)" } |
Set-Content $file.PSPath

(Get-Content $file.PSPath) |
Foreach-Object { $_ -replace $domains[$x][1], "DOMAIN$($x+1)" } |
Set-Content $file.PSPath

有了这个。

(Get-Content $file) -replace $domains[$x][0], "DOMAIN$($x+1)"  -replace $domains[$x][1], "DOMAIN$($x+1)" |
Set-Content $file

.pspath虽然不需要有效。 cmdlet Get/Set-Content将匹配$file对象中参数名称的路径。我无法提供更多帮助。这是未经测试的,因为我没有方便的样本文本文件。测试和测试一些以确保。

答案 1 :(得分:1)

我认为您遇到的问题是您创建多维数组的方式。当我使用你的线时,我得到了一些非常不同的东西。

尝试将第一行重写为此(数组数组):

$domains = @(@("mydomain.net","mydomain"),@("yourdomain.net","yourdomain"),@("mydomain2.net","mydomain2"))

答案 2 :(得分:0)

正如其他两个答案所指出的那样,数组数组与,(x,y,),(foo,bar)" syntax. Use of @`混淆或只是删除了那些领先的逗号修复。

我还发现,即使使用(Get-Content $file.PSPath)语法,写入您正在阅读的同一文件也不适合我。我通过写入新文件然后重命名来获得更一致的结果。