我想弄清楚如何糾正我寫的腳本。我知道它導入主機名列表的方式有問題。我不知道如何解決它。第1部分:這應該導入一個帶有主機名的.csv文件,併爲應用程序的卸載信息挖掘註冊表,並將其放入數組中,然後導出到.csv中供以後使用。此外,它還會創建.txt文件,以便稍後將系統上的應用程序與基準進行比較。Powershell。需要幫助從.csv導入主機名。這工作的其餘部分
$path = "\\path"
$computers = Import-Csv -Path "\\Path\hostnames.csv"
$array = @()
foreach($pc in $computers)
{
$computername = $pc.computername
#$computername = "KNOWN_HOSTNAME" #test line for one system
$UninstallKey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"
$reg = [microsoft.win32.registrykey]::OpenRemoteBaseKey('LocalMachine',$computername)
$regkey = $reg.OpenSubKey($UninstallKey)
$subkeys = $regkey.GetSubKeyNames()
foreach($key in $subkeys)
{
$thisKey=$UninstallKey+"\\"+$key
$thisSubKey=$reg.OpenSubKey($thisKey)
$obj = New-Object PSObject
$obj | Add-Member -MemberType NoteProperty -Name "ComputerName" -Value $computername
$obj | Add-Member -MemberType NoteProperty -Name "DisplayName" -Value $($thisSubKey.GetValue("DisplayName"))
$obj | Add-Member -MemberType NoteProperty -Name "DisplayVersion" -Value $($thisSubKey.GetValue("DisplayVersion"))
$obj | Add-Member -MemberType NoteProperty -Name "Publisher" -Value $($thisSubKey.GetValue("Publisher"))
$obj | Add-Member -MemberType NoteProperty -Name "InstallDate" -Value $($thisSubKey.GetValue("InstallDate"))
$array += $obj
$ExportArray = $array | Where-Object { $_.DisplayName } |
select ComputerName , DisplayName, DisplayVersion, Publisher, InstallDate
$ExportArray |
Export-csv $path\$computername.csv -NoTypeInformation
$ExportArray2 = $array |
Where-Object { $_.DisplayName } |
select DisplayName, DisplayVersion, Publisher
$ExportArray2 |
Export-csv $path\$computername.txt -NoTypeInformation
}
}
第2部分:該部分編譯的.csv的到一個excel文件報告
$csvs = Get-ChildItem $path\* -Include *.csv
$outputfilename = "Network_" + (Get-Date -Format yyyyMMdd)
$excelapp = new-object -comobject Excel.Application
$excelapp.sheetsInNewWorkbook = $csvs.Count
$xlsx = $excelapp.Workbooks.Add()
$sheet=1
foreach ($csv in $csvs)
{
$row=1
$column=1
$worksheet = $xlsx.Worksheets.Item($sheet)
$worksheet.Name = $csv.Name
$file = (Get-Content $csv.PSPath | ForEach-Object {$_ -replace '"', ""})
foreach($line in $file)
{
$linecontents = $line -split ‘,(?!\s*\w+」)’
foreach($cell in $linecontents)
{
$worksheet.Cells.Item($row,$column) = $cell
$column++
}
$column = 1
$row++
}
$sheet++
}
$output = $path + 「\」 + $outputfilename + ".xlsx"
$xlsx.SaveAs($output)
$excelapp.quit()
第3部分:該部分加載了基線,和中的.txt的珍貴創建的,以及用於不同的檢查在文件中。 (也刪除空白輸出中的文件)
$bline = Get-ChildItem $path\* -Include Baseline.txt
$txts = Get-ChildItem $path\* -Include *.txt -Exclude Baseline.txt
foreach ($txt in $txts)
{
Compare-Object -referenceobject $(Get-Content $bline) -differenceobject $(Get-Content $txt) |
ft inputobject, @{n = "file"; e = {if ($_.SideIndicator -eq '=>') {"System"} else {"Baseline"}}} |
Out-File $txt'_has_diff'.csv -Width 256
Get-ChildItem $path |
where {$_.Length -eq 0} |
Remove-Item
}
謝謝
編輯: 的Hostnames.csv文件,我已經試過有:
HOSTNAME1
HOSTNAME2
和
"HOSTNAME1","HOSTNAME2"
你能否解釋一下什麼是不工作? – JNK
第2行中的Import-Csv無法正常工作。 我知道這是因爲它試圖命名文件「@ {HOSTNAME1 = HOSTNAME2} .csv」而不是「HOSTNAME1.csv」 ,並且如果您刪除第7行上的#或僅使用一個主機名,則這一切作品 – user3557458
我想我很困惑如何導入不工作 - 你正在使用一個明確的路徑名。你是說導入的數組不正確? – JNK