繁体   English   中英

如何在Powershell脚本中创建函数?

[英]How to create a function in Powershell script?

如何编写避免对Powershell脚本重复代码的函数,该脚本基本上从控制面板中的“添加和删除”窗口显示安装在计算机上的应用程序列表。

以下是Powershell脚本

Stack.ps1

Clear-Host

#$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition
$scriptPath = $PSScriptRoot
$logFilePath= Join-path $scriptPath "TestResults.log"

#If log file exists, then clear its contents 
if (Test-Path $logFilePath)
{
    clear-content -Path $logFilePath
} 


$log = "Date Of Testing: {0} " -f (Get-Date)
$logString = "Process Started." 
add-content -Path $logFilePath -Value $log -Force 
add-content -Path $logFilePath -Value $logString -Force 
add-content -Path $logFilePath -Value "`n" -Force


#Validate ADD/Remove Program list

add-content -Path $logFilePath -Value "`n" -Force
add-content -Path $logFilePath -Value "Add/Remove Programs :" -Force
add-content -Path $logFilePath -Value "`n" -Force

  $InstalledPrograms = Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*

add-content -Path $logFilePath -Value "`n" -Force
foreach ($InstalledProgram in $InstalledPrograms )
{
   if(($InstalledProgram.DisplayName -ne $Null) -and ($InstalledProgram.DisplayName.Contains("Operational Control")))
    {
        $InstalledProgram |  Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | 
        Format-Table –AutoSize

        $logString = $InstalledProgram.DisplayName 
        $logp = $InstalledProgram.Publisher
        $logv = $InstalledProgram.DisplayVersion
        $logd= $InstalledProgram.InstallDate

        add-content -Path $logFilePath -Value "Product Name: $logString" -Force   
        add-content -Path $logFilePath -Value "Publisher: $logp" -Force  
        add-content -Path $logFilePath -Value "Version: $logv" -Force  
        add-content -Path $logFilePath -Value "InstallDate: $logd" -Force  
        add-content -Path $logFilePath -Value "`n" -Force****

    }

if(($InstalledProgram.DisplayName -ne $Null) -and ($InstalledProgram.DisplayName.Contains("Management Studio")))
    {
        $InstalledProgram |  Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | 
        Format-Table –AutoSize

        $logString = $InstalledProgram.DisplayName 
        $logp = $InstalledProgram.Publisher
        $logv = $InstalledProgram.DisplayVersion
        $logd= $InstalledProgram.InstallDate

        add-content -Path $logFilePath -Value "Product Name: $logString" -Force   
        add-content -Path $logFilePath -Value "Publisher: $logp" -Force  
        add-content -Path $logFilePath -Value "Version: $logv" -Force  
        add-content -Path $logFilePath -Value "InstallDate: $logd" -Force  
        add-content -Path $logFilePath -Value "`n" -Force

    }

    if(($InstalledProgram.DisplayName -ne $Null) -and ($InstalledProgram.DisplayName.Contains("System Analyzer")))
    {
        $InstalledProgram |  Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | 
        Format-Table –AutoSize

        $logString = $InstalledProgram.DisplayName 
        $logp = $InstalledProgram.Publisher
        $logv = $InstalledProgram.DisplayVersion
        $logd= $InstalledProgram.InstallDate

        add-content -Path $logFilePath -Value "Product Name: $logString" -Force   
        add-content -Path $logFilePath -Value "Publisher: $logp" -Force  
        add-content -Path $logFilePath -Value "Version: $logv" -Force  
        add-content -Path $logFilePath -Value "InstallDate: $logd" -Force  
        add-content -Path $logFilePath -Value "`n" -Force

    }

      if(($InstalledProgram.DisplayName -ne $Null) -and ($InstalledProgram.DisplayName.Contains("STeP")))
    {
        $InstalledProgram |  Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | 
        Format-Table –AutoSize

        $logString = $InstalledProgram.DisplayName 
        $logv = $InstalledProgram.DisplayVersion
        $logd= $InstalledProgram.InstallDate

        add-content -Path $logFilePath -Value "Product Name: $logString" -Force   
        add-content -Path $logFilePath -Value "Version: $logv" -Force  
        add-content -Path $logFilePath -Value "InstallDate: $logd" -Force  
        add-content -Path $logFilePath -Value "`n" -Force

    }   
}

我说的是每个if语句下的代码,这些语句用于将Output复制到日志文件。 我可以用函数替换该代码并在每个if语句中调用该函数。

好的,让我们这样做。 函数是关于避免重复的代码,在这里可以在多个级别上完成。 必须先在PowerShell中声明函数,然后才能执行它们,因此我倾向于将所有函数聚集在脚本的开头,如下所示:

# *** FUNCTION DEFINITIONS

function Log-InstalledProgram($InstalledProgram, $LogFilePath)
{
    $InstalledProgram |  Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | 
    Format-Table –AutoSize

    $logString = $InstalledProgram.DisplayName 
    $logp = $InstalledProgram.Publisher
    $logv = $InstalledProgram.DisplayVersion
    $logd= $InstalledProgram.InstallDate

    add-content -Path $LogFilePath -Value "Product Name: $logString" -Force   
    add-content -Path $LogFilePath -Value "Publisher: $logp" -Force  
    add-content -Path $LogFilePath -Value "Version: $logv" -Force  
    add-content -Path $LogFilePath -Value "InstallDate: $logd" -Force  
    add-content -Path $LogFilePath -Value "`n" -Force
}

# *** BEGIN MAIN SCRIPT

Clear-Host

#$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition
$scriptPath = $PSScriptRoot
$logFilePath= Join-path $scriptPath "TestResults.log"

#If log file exists, then clear its contents 
if (Test-Path $logFilePath)
{
    clear-content -Path $logFilePath
} 


$log = "Date Of Testing: {0} " -f (Get-Date)
$logString = "Process Started." 
add-content -Path $logFilePath -Value $log -Force 
add-content -Path $logFilePath -Value $logString -Force 
add-content -Path $logFilePath -Value "`n" -Force


#Validate ADD/Remove Program list

add-content -Path $logFilePath -Value "`n" -Force
add-content -Path $logFilePath -Value "Add/Remove Programs :" -Force
add-content -Path $logFilePath -Value "`n" -Force

  $InstalledPrograms = Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*

add-content -Path $logFilePath -Value "`n" -Force

foreach ($InstalledProgram in $InstalledPrograms )
{
   if(($InstalledProgram.DisplayName -ne $Null) -and ($InstalledProgram.DisplayName.Contains("Operational Control")))
    {
        Log-InstalledProgram $InstalledProgram $logFilePath
    }

    if(($InstalledProgram.DisplayName -ne $Null) -and ($InstalledProgram.DisplayName.Contains("Management Studio")))
    {
        Log-InstalledProgram $InstalledProgram $logFilePath
    }

    if(($InstalledProgram.DisplayName -ne $Null) -and ($InstalledProgram.DisplayName.Contains("System Analyzer")))
    {
        Log-InstalledProgram $InstalledProgram $logFilePath
    }

    if(($InstalledProgram.DisplayName -ne $Null) -and ($InstalledProgram.DisplayName.Contains("STeP")))
    {
        Log-InstalledProgram $InstalledProgram $logFilePath
    }   
}

您可以通过为所需程序添加一个内部循环来进一步减少代码:

foreach ($InstalledProgram in $InstalledPrograms )
{
    foreach ($displayName in "Operational Control","Management Studio", "System Analyzer", "STeP")
    {
        if(($InstalledProgram.DisplayName -ne $Null) -and ($InstalledProgram.DisplayName.Contains($displayName)))
        {
            Log-InstalledProgram $InstalledProgram $logFilePath
        }
    }
}

还有其他优化,例如,您可以避免重复调用Add-Content因为-Value参数还将一个数组作为参数,您可以使用哈希表来捕获要提取的对象属性,并在日志中显示它们的显示名称。文件等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM