Powershell 比较两个csv文件并找出差异

Powershell 比较两个csv文件并找出差异,powershell,Powershell,我是powershell世界的新手,我在powershell上得到了一些用于核对库存的项目 我不知道如何进行这一点,我尝试了一些基本步骤,我能够出口 用户/组/组成员资格 以下是要求: 现在我所取得的成就——感谢Govnah 广告查询: Get-QADUser -searchRoot $OuDomain -SizeLimit 0 | Select-Object dn, sAMAccountName, @{Name="Groups";Expression={(Get-QADMemberOf $

我是powershell世界的新手,我在powershell上得到了一些用于核对库存的项目

我不知道如何进行这一点,我尝试了一些基本步骤,我能够出口

用户/组/组成员资格

以下是要求:

  • 现在我所取得的成就——感谢Govnah
广告查询:

Get-QADUser -searchRoot $OuDomain -SizeLimit 0 |
Select-Object dn, sAMAccountName, @{Name="Groups";Expression={(Get-QADMemberOf $_ | Select-Object -expandProperty Name) -join ";"}} | 
Sort-Object SamAccountName | 
export-csv $FilePath
我现在有两个csv文件,如
AD_users.csv
Oracle_users.csv

我想比较这两个文件并重定向差异,如

Oracle中不存在广告用户 AD中不存在Oracle用户

样本数据

AD_users.csv

u388848993
K847447388
u994888484
k095848889
u388848993
Oracle_users.csv

u388848993
K847447388
u994888484
k095848889
u388848993

我可以查询oracle数据库,AD查询也很好。唯一的问题是我无法比较输出。

我在一个脚本中这样做:

[System.Collections.ArrayList]$adlist = Get-Content c:\users\sverker\desktop\ad.csv |Sort-Object
[System.Collections.ArrayList]$oraclelist = Get-Content c:\users\sverker\desktop\oracle.csv |Sort-Object
$Matching_numbers = @()

ForEach ($number in $adlist)
{
  if ($oraclelist.Contains($number))
  {
        $Matching_numbers += $number
  }
}
ForEach ($number in $Matching_numbers)
{
  $adlist.Remove($number)
  $oraclelist.Remove($number)
}
现在$Matching_numbers包含匹配的数字 而$adlist只包含来自广告的数字 和$oraclelist仅列出Oracle提供的数字

然后可以循环浏览列表并显示值:

Write-Host "Matches:"
ForEach ($value in $Matching_numbers)
{
  $Message += $value + [Environment]::NewLine
}
Write-Host $Message

Write-Host "AD only:"
ForEach ($value in $adlist)
{
  $MessageAd += $value + [Environment]::NewLine
}
Write-Host $MessageAd

Write-Host "Oracle only:"
ForEach ($value in $oraclelist)
{
  $MessageOracle += $value + [Environment]::NewLine
}
Write-Host $MessageOracle 
或者仅仅通过写作

$Matching_numbers
将列表输出到控制台

您可以将$Message变量输出到一个文件中


毫无疑问,有一种更好的方法可以做到这一点,但对于某种类型的文件,这对我来说是有效的。

我在一个脚本中这样做:

[System.Collections.ArrayList]$adlist = Get-Content c:\users\sverker\desktop\ad.csv |Sort-Object
[System.Collections.ArrayList]$oraclelist = Get-Content c:\users\sverker\desktop\oracle.csv |Sort-Object
$Matching_numbers = @()

ForEach ($number in $adlist)
{
  if ($oraclelist.Contains($number))
  {
        $Matching_numbers += $number
  }
}
ForEach ($number in $Matching_numbers)
{
  $adlist.Remove($number)
  $oraclelist.Remove($number)
}
现在$Matching_numbers包含匹配的数字 而$adlist只包含来自广告的数字 和$oraclelist仅列出Oracle提供的数字

然后可以循环浏览列表并显示值:

Write-Host "Matches:"
ForEach ($value in $Matching_numbers)
{
  $Message += $value + [Environment]::NewLine
}
Write-Host $Message

Write-Host "AD only:"
ForEach ($value in $adlist)
{
  $MessageAd += $value + [Environment]::NewLine
}
Write-Host $MessageAd

Write-Host "Oracle only:"
ForEach ($value in $oraclelist)
{
  $MessageOracle += $value + [Environment]::NewLine
}
Write-Host $MessageOracle 
或者仅仅通过写作

$Matching_numbers
将列表输出到控制台

您可以将$Message变量输出到一个文件中


毫无疑问,有一种更好的方法可以做到这一点,但对于某种类型的文件,这对我来说很有效。

让我们看看您的CSV文件数据。用这两个例子更新你的问题。用示例文本替换敏感信息。csv文件中只有这些列吗?顶部不也应该有列名吗?正如@user978511所指出的,看起来您缺少标题
dn、sAMAcountName、组
和相关数据示例文本。让我们看看您的CSV文件数据可能重复。用这两个例子更新你的问题。用示例文本替换敏感信息。csv文件中只有这些列吗?顶部不应该也有列名吗?正如@user978511所指出的,看起来您缺少标题
dn、sAMAcountName、Groups
和相关的数据示例文本。可能是重复的,为什么我没有想到呢。我想我还不明白Powershell有.Net的功能:)我会更新答案的,很明显,既然你提到了:)那么你应该只在输出中写入$oraclelist和$adlist,也许可以使用
$oraclelist | Out文件C:\oracleonly.txt
不,这花了很多时间,仍然重定向到匹配用户id,包含在两个文件中的用户id。没有区别嗨,你能帮我找出区别吗,我只得到了匹配的记录是的,为什么我没有想到这一点。我想我还不明白Powershell有.Net的功能:)我会更新答案的,很明显,既然你提到了:)那么你应该只在输出中写入$oraclelist和$adlist,也许可以使用
$oraclelist | Out文件C:\oracleonly.txt
不,这花了很多时间,仍然重定向到匹配用户id,包含在两个文件中的用户id。没有差别嗨,你能帮我找出差别吗?我只得到了一份匹配的记录