【问题标题】:Windows PowerShell invoking function with parameters带参数的 Windows PowerShell 调用函数
【发布时间】:2014-01-27 00:13:59
【问题描述】:

我对 PowerShell 完全陌生,正在尝试编写一个简单的脚本来生成日志文件。我搜索了论坛,找不到我的问题的答案。 我在网上找到了我认为有用的示例,并将其应用于我的脚本:

## 获取当前日期和时间。作为回报,你会得到类似这样的结果: Sat January 25 10:07:25 2014
$curDateTime = 获取日期
$logDate = 获取日期格式“MM-dd-yyyy HH:mm:ss”
$LogPath = "C:\Temp\Log"
$LogName = "log_file_" + $logDate + ".log"
$sFullPath = $LogPath + "\" + $LogName



功能日志开始{
    

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

    过程 {
        ## $sFullPath = $LogPath + "\" + $LogName

        # 创建文件并开始记录
        New-Item -Path $LogPath -Value $LogName –ItemType File

        添加内容 -Path $sFullPath -Value "****************************************** ****************************************************** *********”
        Add-Content -Path $sFullPath -Value “在 [$([DateTime]::Now)] 开始处理。”
        添加内容 -Path $sFullPath -Value "****************************************** ****************************************************** *********”
        添加内容 -Path $sFullPath -Value ""
    }
}

Set-StrictMode -版本“最新”

日志开始
....

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

【问题讨论】:

    标签: function powershell parameters


    【解决方案1】:

    您在脚本顶部定义了自定义参数,现在您必须通过更改将它们传递给函数

    Log-Start

    要读取的行

    Log-Start $LogPath $LogName

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

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

    你的脚本仍然可以工作。

    【讨论】:

    • 不应该是这样吗? Log-Start -LogPath $LogPath -LogName $LogName 不只是 $logpath 和 $logname?
    • 它不再要求输入,但给出以下错误:New-Item : The given path's format is not supported.在 zzz.ps1:82 char:17 + New-Item
    • 您正在尝试创建一个包含“:”的文件,更改 $logDate = Get-Date -format "MM-dd-yyyy HH-mm-ss"。至于输入,它是位置性的,因此您不必使用 -LogPath 和 -LogName 只要您的参数以正确的顺序传递。
    • 是的,完全忘记了 Windows 不喜欢文件名中的 ':',更改了格式并且它起作用了。但是让我再问你一个问题。如果我想在两个不同的环境中运行脚本,并且想使用所有参数创建文件并在我的脚本中执行某种“包含”并从那里提取所有参数,那么最好使用什么命令?感谢您的建议。
    【解决方案2】:

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

    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")  
    

    【讨论】:

    • 我完全按照您的建议定义了配置文件,将函数复制到我的代码中,并且在所有函数定义之后的第一行读取:$config = GetConfig $configFile。我收到的错误是 [DBG]>>> 你不能在空值表达式上调用方法。在 xxx.ps1:73 char:87 + $tempConfig.Add($lineArray[0].Trim(), $lineArray[1].Trim(), $lineArray[2].Trim
    • 你一定没有使用我的代码 exactly 作为你的错误: $tempConfig.Add($lineArray[0].Trim(), $lineArray[1].Trim( ), $lineArray[2].Trim 显示您添加了 $lineArray[2].Trim 我假设您修改了代码以在配置文件中考虑超过 2 个键/值对,但功能该代码行是将每个配置行拆分为 = 字符。只需将更多键/值对添加到您的配置文件中,它们就会被导入 ok ;)
    • 他们没有。在我的配置文件中有另一个名称/值对,它给了我错误。当我只使用两个变量时工作得很好。我想我做错了什么
    • 我不确定我是否理解你的答案,你能说得更具体点吗?只要键是唯一的(并且没有空行),无论您的配置中有多少键/值对,上述代码都无需更改。您附加的错误显示正在执行的额外代码 $lineArray[2].Trim 导致问题。
    • 是的,我不需要添加另一个 $lineArray 项目 2。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2012-02-26
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 2017-12-27
    • 2014-04-02
    相关资源
    最近更新 更多