比较对象与进程的奇怪行为

时间:2018-01-06 16:52:39

标签: file powershell

我想在PowerShell中将两个txt文件与进程信息进行比较。 我查了很多网站,总有这么简单的

Compare-Object $(Get-Content [RandomFilePath]) $(Get-Content [RandomFilePath])

报价。

现在由于某种原因,每当我尝试使用包含进程信息的txt文件时,shell总是输出两个文件的全部内容,而不是差异。但是,当我将两个txt文件与每行中的随机单词进行比较时,输出会正确地说明差异。

出于某种原因,当我比较两个包含过程信息的txt文件时,才会发生这种情况。

这是我使用的代码。我已事先更改了目录,但是我也尝试了整个文件路径以防万一,但结果相同。

Compare-Object $(Get-Content proc.txt) $(Get-Content proc1.txt)

两个文件的内容只是一个普通文件(每个文件都有不同的进程)

Get-Process > proc.txt

我希望输出如下:

InputObject                             SideIndicator
-----------                             -------------
System.Diagnostics.Process (EXCEL)      =>
System.Diagnostics.Process (freecell)   =>
System.Diagnostics.Process (notepad)    =>
System.Diagnostics.Process (dexplore)   <=

然而,如果你输入

,我得到的就是在txt文件中写的内容
Get-Process > file.txt

修改

当我这样写时:

$a = Get-Process
notepad
$b = Get-Process

Compare-Object $a $b

我明白了:

System.Diagnostics.Process (notepad) =>

但是,当我使用带有来自Get-Process的信息的txt文件而不是这些变量时,控制台会输出文件的全部内容而不是上面的差异。

2 个答案:

答案 0 :(得分:2)

输出重定向运算符将Get-Process输出的默认文本表示写入文件。这意味着您的输出是表格形式的文本,而不是Process个对象。表格输出包含CPU和内存使用等信息,这些信息随时间变化,以及PID和句柄,它们会在进程的调用中发生变化。因此,输入文件中的大多数(如果不是全部)行很可能在这些值中至少有一个不同。这意味着你根本没有匹配的线条。周期。

您实际上想要比较的只是流程名称。当然你可以解析那些文本文件,但我不推荐它。修复输入要好得多:

Get-Process | Select-Object -Expand Name > proc.txt

然后你可以像这样比较2个输出文件:

Compare-Object (Get-Content proc.txt) (Get-Content proc1.txt)

但是,如果您还需要其他流程信息,则可能需要考虑使用Export-ClixmlExport-Csv

Get-Process | Export-Clixml proc.xml
# or
Get-Process | Export-Csv proc.csv -NoType

然后你可以像这样比较2个输出文件:

Compare-Object (Import-Clixml proc.xml) (Import-Clixml proc1.xml) -Property Name -PassThru
# or
Compare-Object (Import-Csv proc.csv) (Import-Csv proc1.csv) -Property Name -PassThru

答案 1 :(得分:0)

不确定导致此问题的原因,但这是一个故障排除提示。 使用以下:

Compare-Object $(Get-Content proc.txt) $(Get-Content proc.txt)

现在应该没有区别。只是为了使用进程文件测试Compare是否正常工作。 将进程导出为.csv文件格式并再次进行比较。这可能会有效。