【发布时间】:2014-01-31 05:59:17
【问题描述】:
如何加快 PowerShell 脚本的处理速度?
它从 apps.csv 文件(包含 2 个应用程序 - Windows XP 和 Windows 7 版本)中提取信息,并从 hosts.csv 文件中提取信息。
应用程序位置在不同的主机名上进行测试(我可以判断它们是否是 Windows XP/Windows 7 机器),以通过检查指纹来查看它们是否已安装。
目前运行 40+ 条记录大约需要 5-10 分钟,确实需要加快速度。
clear all
$Applications = @{}
$ComputerObjects = @()
# Gets OS
function Get-OS ([string]$hostname) {
$os = "offline"
gwmi win32_operatingsystem -computername $hostname -ea silentlycontinue | ForEach-Object {
if($_.Version.ToString().StartsWith("6.1")) {
$os = "Windows 7"
} elseif ($_.Version.ToString().StartsWith("5.1")){
$os = "Windows XP"
} else {
$os = "N/A"
}
} > $null
return $os
}
# Sorts out the application information, breaking it into OS, LOB and then finally Location
Import-CSV C:\RDC\apps.csv | ForEach-Object {
$appname = $_.appname.ToLower()
$os = $_.os.ToLower()
$lob = $_.lob.ToLower()
$location = $_.location.ToLower()
if ($Applications.Keys -notcontains $appname) {
$WindowsOS=@{}
# hashtable for windows xp and windows 7 applications
$WindowsOS["windows xp"]=@{}
$WindowsOS["windows 7"]=@{}
$Applications[$appname]=$WindowsOS
}
if ($Applications[$appname][$os].Keys -notcontains $lob) {
$Applications[$appname][$os][$lob]=@()
}
if ($Applications[$appname][$os][$lob].Keys -notcontains $location) {
$Applications[$appname][$os][$lob]+=$location
}
}
# Sorts the Hostnames out and tests all Application Locations
Import-CSV C:\RDC\hosts.csv | ForEach-Object {
$Properties = @{}
$Properties["hostname"]=$_.hostname.ToLower()
$Properties["lob"]=$_.type.ToLower()
$Properties["os"]=Get-OS $Properties["hostname"]
$Applications.Keys | ForEach-Object {
$currAppName = $_
$Properties[$currAppName]=$false;
if ($Applications[$currAppName].Keys -contains $Properties["os"] -and $Applications[$currAppName][$Properties["os"]].Keys -contains $Properties["lob"]) {
$Applications[$currAppName][$Properties["os"]][$Properties["lob"]] | ForEach-Object {
$Properties[$currAppName]=$Properties[$currAppName] -or (Test-Path "\\$($Properties["hostname"])\$($_)")
}
}
}
$HostObject = New-Object PSObject -Property $Properties
$ComputerObjects += $HostObject
}
$ComputerObjects | ft
$a = [int][double]::Parse((Get-Date -UFormat %s))
#$ComputerObjects | Export-csv "C:\Working\results_$a.csv" -NoTypeInformation
【问题讨论】:
-
你真的应该看看 *-job cmdlet (technet.microsoft.com/en-us/library/hh847783(v=wps.620).aspx)
-
我要做的第一件事是从您要导入的 CSV 文件中创建一个变量,而不是直接将它们导入到 foreach 循环中。
-
谢谢大家 - 任何关于如何改进我的代码的建议都会有帮助
标签: powershell csv