powershell 更好的方法来测试两个目录是否存在或仅存在于来自域的所有 pc 上并输出到 csv

powershell better way to test if both directories exists or one only on all pc's from domain and output to csv

你能帮我更正这个脚本(从互联网上收集的片段)或者更好地改变它应该如何工作的逻辑(目前不工作)。目标是获取只存在一个文件夹 (oracle11) 而不是两个文件夹 (11+12) 的 pc,并将其导出到 csv。甲骨文是一个真正的痛苦...... 预先感谢您的建议。

Import-Module ActiveDirectory
$computers = Get-ADComputer -Filter * -Properties * | Select -Property Name
$output = @()

#$computers = get-adcomputer -filter * | Select-Object -Expand Name | foreach-object {

Foreach ($Computer in $computers){
  if ( (test-path "\$Computer\C$\oracle\product.2.0\" ) -and !( test-path "\$Computer\C$\oracle\product.2.0" )) {
    $output += $Computer
  }
} 
$output | Export-Csv -NoTypeInformation -Path c:\temp\test.csv

问题是你在循环中构建的路径字符串与你期望的不一样。

当您将输出从 Get-ADComputer 传输到 Select-Object -Property Name 时,它会为每个输入对象创建一个具有单个 属性 Name 的新对象。

当您随后将这些对象之一隐式转换为字符串时,结果值将是 "@{Name=Computer01}",而不仅仅是 "Computer01".

你可以自己观察,通过调用 Write-Host 而不是 Test-Path:

Get-ADComputer -Filter * |Select-Object -Property Name |ForEach-Object {
  Write-Host "\$_\C$"
}

要仅从每个 ADComputer 中提取 Name 属性 的值,请使用 ForEach-Object -MemberName 而不是 Select-Object -Property:

$computerNames = Get-ADComputer -Filter * -Properties * | ForEach-Object -MemberName
$output = @()

foreach($ComputerName in $computerNames){
  if ( (Test-Path "\$ComputerName\C$\oracle\product.2.0\" ) -and !( Test-Path "\$ComputerName\C$\oracle\product.2.0" )) {
    $output += $ComputerName
  }
} 
$output | Export-Csv -NoTypeInformation -Path c:\temp\test.csv

请注意,将 -Properties * 传递给 Get-ADComputer 是不必要的,对象名称始终是 Get-AD* cmdlet 发回的默认 属性 集的一部分。