我正在尝试编写我的第一个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
答案 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'
)
这是我用于记录功能的参数。