Tenho um .ps1 que tem um -path
parâmetro ao qual gostaria de dar um valor padrão, por meio do $PSDefaultParameterValues
dicionário. Imaginei que isso funcionaria da mesma forma que os cmdlets:
$PSDefaultParameterValues=@{
"C:\Users\user1\Documents\PowerShell\Scripts\myScript.ps1:path" = "C:\temp\db.jsonc"
}
O código para myScript.ps1
ser:
[CmdletBinding()]
param (
[Parameter(ValueFromPipeline,ValueFromPipelineByPropertyName,mandatory)]
[string]$Path
)
"path ---> $path"
Então, quando eu digito, .\myScript.ps1
recebo o prompt "Fornecer valores para os seguintes parâmetros:", mas se eu executar, .\myScript.ps1 -path c:\some\path
a saída épath ---> c:\some\path
Tentei retrabalhar o dicionário, mas o script ainda não recebe um valor para o -path
parâmetro:
$PSDefaultParameterValues=@{
#"myScript.ps1:path" = "C:\temp\db.jsonc"
"myScript.:pfath" = "C:\temp\db.jsonc" # this does not work either
#"C:\Users\user1\Documents\PowerShell\Scripts\myScript.ps1:path" = "C:\temp\db.jsonc"
}
O about_Parameters_Default_Values nunca declara que um caminho de script é suportado. Use um valor padrão no seu parâmetro de script e remova a
Mandatory
decoração:Ou use uma função:
Para complementar a resposta útil de Santiago com informações básicas :
Na verdade, o tópico de ajuda about_Parameters_Default_Values atualmente não menciona suporte para arquivos de script (
*.ps1
)De fato , no entanto, entradas para
*.ps1
arquivos são suportadas, mas se e somente se :O arquivo de script é referenciado apenas pelo nome do arquivo , incluindo principalmente a extensão do nome do arquivo; no seu caso, isso significa:
'myScript.ps1:path'
...... e o script de destino é implementado como um script avançado
param(...)
, o que significa que ele tem um bloco decorado com um[CmdletBinding()]
atributo e/ou pelo menos um dos parâmetros declarados dentro desse bloco é decorado com um[Parameter()]
atributo.O resultado :
Considerando que seu arquivo de script é avançado, o seguinte funcionaria , independentemente de você usar um caminho (se não, seu
.ps1
arquivo deve ser descoberto via$env:PATH
) ou, se for, independentemente de qual caminho específico você usar, na invocação :Entretanto, o acima implica que qualquer um
myScript.ps1
que você invocar - independentemente de sua localização - pode acionar o uso do valor do parâmetro padrão, desde que o script de destino seja (a) avançado e (b) declare um parâmetro correspondente, como-Path
neste caso.