0

我想在我的 Active Directory 环境中使用包含站点名称的 CSV 导入站点:

我的 CSV 输入示例:

New York
Dallas
New Jersey

我想制作一个脚本,在实际创建过程发生之前首先检查站点的存在。但是,我在检查 2 个数组的输入时遇到了一些麻烦:

#Clear process
$ADsites = ""
$SitesFilter = ""
$CSV = ""

[array] $ADSites = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest().Sites 

$csv=Import-Csv c:\sites.csv -header "Site"

#Filtering the Sitenames
Foreach ($ADSite in $ADSites) {
    [array] $SitesFilter += $ADSite.Name
}

$CSV | Foreach-Object {
    if (??? -eq $_.Site) {
        Write-Host "Site" $_.Site "already exists" 
    } else {
        Write-Host "Site" $_.Site "is not found"
    }
}

如何将数组的内容$SitesFilter与 CSV 文件中的站点名称进行比较?

4

3 回答 3

2

希望下面的脚本可以提供帮助,您应该使用-in,它可以判断对象是否在数组中

[array] $ADSites = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest().Sites 

$csv=Import-Csv c:\sites.csv -header "Site"

#Get an site name string array
$SitesFilter = @($ADSites | %{"$($_.Name)"}) 

$CSV | Foreach-Object {
    if ($SitesFilter -contains $_.Site ){
                Write-Host "Site $($_.Site) already exists" 
    } Else { Write-Host "Site $($_.Site) is not found" }
}
于 2013-03-09T11:57:32.890 回答
0
$array1 = '1','2','3'
$array2 = '2','3','4'
compare $array1 $array2
get-help compare-object -full

希望这可以帮助

于 2013-03-10T06:28:33.940 回答
0

BobLobLaw 的答案有一个有趣的想法,但不幸的是太不完整而无法实际使用。我看到它有两个问题:

  • Import-Csv生成一个自定义对象数组,而 OP$SitesFilter是一个字符串数组。Compare-Object除非比较的项目属于同一类型,否则将始终将每个项目报告为不同的。
  • Compare-Object将报告双方的差异,即 AD 中不存在的站点以及 AD 中存在但未在 CSV 中列出的站点。如果 OP 只想要 AD 中尚不存在的站点,他将不得不过滤输出SideIndicator。但是,您不能同时扩展InputObject和。SideIndicatorselect -Expand

这样的事情可能会奏效:

$csv = Import-Csv "c:\sites.csv" -Header "Site" | % { $_.Site }

compare $csv $SitesFilter | ? {
  (select -Input $_ -Expand SideIndicator) -eq "<="
} | select -Expand InputObject

为了报告哪个网站存在或不存在,这样的事情可能会做:

compare $csv $SitesFilter | % {
  if ( (select -Input $_ -Expand SideIndicator) -eq "<=" ) {
    "Site '{0}' doesn't exist." -f (select -Input $_ -Expand InputObject)
  } else {
    "Site '{0}' already exists." -f (select -Input $_ -Expand InputObject)
  }
}

或者可以select将信息转换为自定义对象:

$site   = { select -Input $_ -Expand InputObject }
$exists = { (select -Input $_ -Expand SideIndicator) -ne "<=" }

compare $csv $SitesFilter `
  | select @{n='Site';e=$site},@{n='Exists';e=$exists} `
  | % {
    if ( $_.Exists ) {
      "Site '{0}' exists." -f $_.Site
    } else {
      "Site '{0}' doesn't exist." -f $_.Site
    }
  }
于 2013-03-10T11:54:11.830 回答