2011-11-02 44 views
1

我有一个PowerShell脚本,用于生成发送到文件Dynamic.txt的数据。该脚本生成符合特定标准的服务器列表。该列表随后被处理。不过,我有大约20台符合列表中不需要的标准的服务器。根据静态文件中的数据从动态文件中删除文本

这是我的静态列表。我可以使用Foreach-Object {$_ -replace "xxx", ""}命令从列表中删除服务器。然而,这是混乱的,我想要更干净的代码。如何根据Static.txt中的数据从Dynamic.txt中删除数据?

回答

1

您可以使用Compare-Object cmdlet。

比较对象cmdlet比较两组对象。一组 对象是参考集,另一组是Difference集。

下面是一些示例代码。

colors.txt的内容:

red 
green 
blue 
pink 

notcolors.txt的内容:

green 

命令和输出:

compare-object (Get-Content "notcolors.txt") (Get-Content "colors.txt") | FL 


InputObject : red 
SideIndicator : => 

InputObject : blue 
SideIndicator : => 

InputObject : pink 
SideIndicator : => 

只需从结果中选择InputObject应该给你正确的服务器列表。

这是powershell,还有其他方法。你可以在可能会去像这样的脚本的某处使用过滤器(您可能需要切换各地$ _。名称和获取内容部分,以获得逻辑正确的。)

...| Where-Object {$_.Name -notmatch (Get-Content serverlist.txt)} | ... 
+0

这就是它。谢谢! – RaleighBP

+0

将'Get-Content'放置在'Where-Object'语句中可能不是一个好主意,因为整个文件将被读取给每个通过管道的对象。运算符应该是'-notcontains',并且静态服务器数组应该位于运算符的左侧(尽管在PowerShell v3中有'-NotIn'运算符,它要求该数组位于右侧)。 'Where-Object'应该在条件语句周围有{}。 – Rynant

+2

@RaleighBP - 请注意,如果在静态列表中出现任何不在动态列表中的服务器,“比较对象”CmdLet也会从静态列表中返回服务器,并且您必须检查'SideIndicator' – Rynant

1

要删除条目基于另一个文本文件中的条目一个文本文件,diff.txt的

$dynamic = Get-Content .\Dynamic.txt 
$static = Get-Content .\Static.txt 

$dynamic| where { $static -notcontains $_ }| Set-Content .\Dynamic.txt 
0

说的内容应该等于文件X和法利的差异,然后用下面的代码

$fileA = 'fileA.txt' 
$fileB = 'fileB.txt' 
$diff = 'diff.txt' 

$fileAContent = Get-Content $fileA -Encoding UTF8 
$fileBContent = Get-Content $fileB -Encoding UTF8 
$fileAContent| where { $fileBContent -notcontains $_ }| Set-Content $diff