Я не вижу ничего плохого в этом блоке параметров. Чтобы быть уверенным, я тестировал это в PowerShell Core 7, и он работал нормально.
param
(
[Parameter(Position=0,Mandatory)]
[string[]]$TemplateNames,
[Parameter(Position=1)]
[string]$Mode = "d",
[Parameter(Position=2)]
[string]$Log = $env:TEMP
)
"TemplateNames: {0}" -f ($TemplateNames -join ",")
"Mode: {0}" -f $Mode
"Log {0}" -f $Log
# only pass templates
.\foo.ps1 a,b,c
TemplateNames: a,b,c
Mode: d
Log C:\Users\user\AppData\Local\Temp
# pass templates and mode
.\foo.ps1 a,b,c X
TemplateNames: a,b,c
Mode: X
Log C:\Users\user\AppData\Local\Temp
# pass templates, mode and log path
.\foo.ps1 a,b,c X c:\temp\foobar
TemplateNames: a,b,c
Mode: X
Log c:\temp\foobar
Помните, что если вы хотите передать журнал и шаблоны, но НЕ режим, вам придется использовать именованные параметры (из-за строгой упорядоченности позиций)
.\foo.ps1 a,b,c -Log c:\temp\foobar