我正在尝试整理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
}
}
答案 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)
语法,写入您正在阅读的同一文件也不适合我。我通过写入新文件然后重命名来获得更一致的结果。