Não pode chamar um script do Powershell através do registro corretamente. Um parâmetro posicional não pode ser encontrada, que aceita o argumento '$null'

0

Pergunta

Aqui é um teste simples função chamada RegistryBoundParams.ps1:

[CmdletBinding()]
param (
    [Parameter(Mandatory = $true)]
    [string]
    $Target,

    [Parameter(Mandatory = $false)]
    [switch]
    $MySwitch
)

if(!(Test-IsAdmin)){
    Request-AdminRights -NoExit
    Exit
}

if($MySwitch){
    "Do something" | Out-Host
}else {
    "Do something else" | Out-Host
}

Show-AllArguments

Se eu chamá-lo através do PS terminal, tudo funciona conforme o esperado:

Exata chamada: C:\Tools\scripts> .\RegistryBoundParams.ps1 -Target "C:\Test\" -MySwitch

enter image description here

enter image description here

Se eu chamá-lo através do registro (adicionando o comando a um menu de contexto), eu recebo:

pwsh -noexit -file "C:\Tools\scripts\RegistryBoundParams.ps1" -Target "C:\Program Files\Python39\python.exe" -MySwitch

enter image description here enter image description here enter image description here

Plaintext de erro: RegistryBoundParams.ps1: A positional parameter cannot be found that accepts argument '$null'.

Aqui está um arquivo reg, que mostra exatamente o que eu adicionei no registro:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\1_TestRegistry]
@="Test Powershell Script from Registry"
"Icon"="C:\\Tools\\icons\\apps\\Powershell 1.ico,0"
"NeverDefault"=""

[HKEY_CLASSES_ROOT\*\shell\1_TestRegistry\command]
@="pwsh -noexit -file \"C:\\Tools\\scripts\\RegistryBoundParams.ps1\" -Target \"C:\\Program Files\\Python39\\python.exe\""

Então, em algum lugar ao longo das linhas de $Null está sendo passado para o script, e eu não tenho Idéia do porquê.

Eu poderia realmente usar alguma ajuda aqui.

Muito obrigado por qualquer orientação.

Editar:


Eu achei que se eu adicionar uma nova variável de seqüência de caracteres chamado $catchall, o script funciona. Eu suspeito que ao serem chamados a partir do registro é de acrescentar um valor nulo por algum motivo. É por isso que o script funciona quando eu definir um adicional de "pegar todos" variável.

Isso definitivamente não é uma solução ideal em tudo, então eu ainda estou procurando uma solução aqui. Realmente aprecio qualquer ajuda!

Edit2:


Acontece que o Request-AdminRights script que eu estava usando mklement0 o autor tinha um bug que já foi corrigido. Quem quer uma linha de auto-elevação com vinculado/parâmetro independente do suporte que é multi-plataforma... vá buscá-lo!

contextmenu powershell registry windows
2021-11-15 17:19:45
1

Melhor resposta

1

O problema era (já corrigido) bug no código que você baseia a sua auto-elevatória de função Request-AdminRights sobre:

O erro foi que no caso de um avançado script como o seu, $args - o que nunca é vinculado avançadas de scripts - foi por engano serializado como $null em vez de traduzido para @(), resultando em que $null chegando passado como um argumento extra no re-invocação.

Se você redefinir o seu Request-AdminRights função com base na agora atualizado corpo do Ensure-Elevated função original de respostas, o problema deve desaparecer - não há necessidade de alterar o delimitador de script.

2021-11-15 19:39:31

Impressionante! Obrigado. Eu modifiquei o script muito minimamente para apoio NoExit mudar. Você pode encontrá-lo aqui: github.com/visusys/VSYSFileOps/blob/main/Public/...
Jay

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................