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 发回的默认 属性 集的一部分。
你能帮我更正这个脚本(从互联网上收集的片段)或者更好地改变它应该如何工作的逻辑(目前不工作)。目标是获取只存在一个文件夹 (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 发回的默认 属性 集的一部分。