Powershell模块功能:无法找到接受参数的位置参数

时间:2018-03-09 14:04:58

标签: powershell

我正在尝试编写我的第一个Powershell模块,但我遇到了一个我无法解决的问题。

我在模块中有一个记录功能,如下所示:

function Write-Log {
    [cmdletbinding()]
    param(
        [switch]$Success,
        [switch]$Error,
        [switch]$Path,
        [Parameter(mandatory=$true, position=0)][string]$Message
    )

    $logToFile = $false

    if ($Path) {
    Write-Host "PATH SET"
        $logToFile = $true
        if (!$(Test-Path -Path $Path)) {
            Write-Host "Path not found"
        }
    }

    if ($Success) {
        Write-Host -ForegroundColor Green ("SUCCESS: $Message")
    }

    if ($Error) {
        Write-Host -ForegroundColor Red ("ERROR: $Message")
    }

    if ($PSCmdlet.MyInvocation.BoundParameters["Debug"].IsPresent) {
        Write-Host -ForegroundColor Yellow ("DEBUG: $Message")
    }
}

正如人们注意到的那样,功能尚未完成。但这并不影响这个问题。

当我从另一个脚本调用Write-Log时,我可以运行任何参数组合,但-Path除外。一旦我尝试使用-Path,我就会收到以下错误:

 Write-Log -Message "hi" -Success -Path c:\temp
    Write-Log : A positional parameter cannot be found that accepts argument 'c:\temp'.
    At line:2 char:1
    + Write-Log -Message "hi" -Success -Path c:\temp
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidArgument: (:) [Write-Log], ParameterBindingException
        + FullyQualifiedErrorId : PositionalParameterNotFound,Write-Log

2 个答案:

答案 0 :(得分:3)

你写的方式,Path是一个switch参数,而不是一个字符串参数。我想你的意思是在你的参数列表中有[string]$Path,

答案 1 :(得分:2)

你需要在这种情况下将-Path参数类型更改为你在控制台上传递的类型[String],还要在不同的注释上更改我认为如果你使用n次切换的话会更好一组接受这样的日志类型:

Param (
    [Parameter(
                Mandatory = $true,
                Position = 0)]
    [String]$Data,

    [Parameter(Position = 1)]
    [ValidateNotNullOrEmpty()]
    [ValidateCount(0, 5)]
    [Array]$To = @($logRouteFile),

    [ValidateSet('Start', 'Section', 'Title', 'End', 'Information', 'Business_Error', 'Error')]
    [String]$Type = 'Information'
)

这是我用于记录功能的参数。