Windows PowerShell使用参数调用函数

时间:2014-01-27 00:14:00

标签: function powershell parameters

我是PowerShell的新手,并尝试编写一个简单的脚本来生成日志文件。我搜索论坛,找不到我的问题的答案。 我在网上找到了一个例子,我觉得它很有用,并将它应用到我的脚本中:

## Get current date and time. In return, you’ll get back something similar to this: Sat January 25 10:07:25 2014
$curDateTime = Get-Date
$logDate = Get-Date -format "MM-dd-yyyy HH:mm:ss"
$LogPath = "C:\Temp\Log"
$LogName = "log_file_" + $logDate + ".log"
$sFullPath = $LogPath + "\" + $LogName

<#
    param(
    ## The path to individual location files
    $Path,

    ## The target path of the merged file
    $Destination, 

    ## Log path
    $LogPath,

    ## Log name   
    $LogName

    ## Full LogFile Path
    ## $sFullPath = $LogPath + "\" + $LogName
)
#>

Function Log-Start {
    <#
    .SYNOPSIS
        Creates log file
    .DESCRIPTION
        Creates log file with path and name that is passed. 
        Once created, writes initial logging data
    .PARAMETER LogPath
        Mandatory. Path of where log is to be created. Example: C:\Windows\Temp
    .PARAMETER LogName
        Mandatory. Name of log file to be created. Example: Test_Script.log
    .INPUTS
        Parameters above
    .OUTPUTS
        Log file created
    #>

    [CmdletBinding()]
    Param ([Parameter(Mandatory=$true)][string]$LogPath, [Parameter(Mandatory=$true)][string]$LogName)

    Process {        
        ## $sFullPath = $LogPath + "\" + $LogName

        # Create file and start logging
        New-Item -Path $LogPath -Value $LogName –ItemType File

        Add-Content -Path $sFullPath -Value "***************************************************************************************************"
        Add-Content -Path $sFullPath -Value "Started processing at [$([DateTime]::Now)]."
        Add-Content -Path $sFullPath -Value "***************************************************************************************************"
        Add-Content -Path $sFullPath -Value ""
    }       
}

Set-StrictMode -Version "Latest"

Log-Start
....

问题是我如何使Log_Start函数使用我在脚本开头指定的变量,或者不能声明[CmdletBinding()]和函数本身。 如果我尝试以编码的方式运行它,它会提示我输入路径和日志名称,我认为应该使用我已经定义的内容。显然我错过了这个概念。我当然可以在函数的param声明中直接分配我需要的值,但我打算使用一些更多的函数,如log-write和log-finish,并且不希望复制相同的值。 我错过了什么?

2 个答案:

答案 0 :(得分:1)

您在脚本顶部定义了自定义参数,现在必须通过更改

将它们传递给函数

Log-Start

行阅读

Log-Start $LogPath $LogName

虽然你最好不同地命名你的参数以避免混淆。你不需要CmdletBinding()声明,除非你打算在你的函数中使用像-Verbose或-Debug这样的常用参数,这样你就可以摆脱以下两行:

[CmdletBinding()]
Param ([Parameter(Mandatory=$true)][string]$LogPath, [Parameter(Mandatory=$true)][string]$LogName)

并且您的脚本仍然可以使用。

答案 1 :(得分:0)

如果要包含配置文件中的设置,则一种方法是哈希表。您的配置文件如下所示:

logpath=c:\somepath\
server=server.domain

然后你的脚本会有一个额外的var指向一个配置文件和一个导入它的函数:

$configFile = "c:\some.config";  
function GetConfig(){  
    $tempConfig = @{};  
    $configLines = cat $configFile -ErrorAction Stop;  
    foreach($line in $configLines){         
        $lineArray = $line -split "=";          
        $tempConfig.Add($lineArray[0].Trim(), $lineArray[1].Trim());        
    }  
    return $tempConfig;
}  
$config = GetConfig  

然后,您可以将配置值分配给变量:

$LogPath = $conifg.Item("logpath")  
$server = $conifg.Item("server")  

或直接使用他们访问

$conifg.Item("server")