Non si può chiamare uno script di Powershell attraverso il registro di sistema correttamente. Un parametro posizionale non può essere trovato che accetta l'argomento '$null,'

0

Domanda

Ecco una semplice funzione di test chiamato 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 ho chiamata tramite il PS terminale, tutto funziona come previsto:

Esatto chiamare: C:\Tools\scripts> .\RegistryBoundParams.ps1 -Target "C:\Test\" -MySwitch

enter image description here

enter image description here

Se io la chiamo attraverso il registro di sistema (con l'aggiunta di comando in un menu di contesto), ottengo:

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

Chiaro di errore: RegistryBoundParams.ps1: A positional parameter cannot be found that accepts argument '$null'.

Ecco un file reg che mostra esattamente ciò che ho aggiunto nel registro di sistema:

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\""

Quindi da qualche parte lungo le linee di $Null viene passato allo script, e non ho Idea del perché.

Ho potuto davvero usare un certo aiuto qui.

Grazie mille per tutti gli orientamenti.

Edit:


Ho scoperto che se posso aggiungere una nuova stringa variabile chiamata $generiche, lo script funziona. Ho il sospetto che quando viene chiamato dal registro di sistema, è l'aggiunta di un valore null per qualche motivo. Che è il motivo per cui lo script funziona quando definisco il "catch all" variabile.

Questa non è sicuramente la soluzione ideale a tutti, sono ancora alla ricerca di una soluzione qui. Davvero apprezzare qualsiasi aiuto!

Edit2:


Si scopre che il Request-AdminRights script che usavo che mklement0 autore aveva un bug che è stato risolto. Chi vuole una-linea self elevazione con legato/unbound parametro supporto cross-platform... andare a prenderlo!

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

Migliore risposta

1

Il problema era (dal-risolto bug nel codice che si basa la vostra auto-elevazione funzione Request-AdminRights in:

Il problema è stato che nel caso di un avanzato script come il vostro, $args - che non è mai legato in script avanzati - erroneamente è stato serializzato come $null invece di tradurre per @(), che $null farsi passare come un ulteriore argomento a ri-invocazione.

Se si ridefinire il Request-AdminRights funzione basata sull'ora hanno aggiornato il corpo del Ensure-Elevated funzione in originale risposta, il problema dovrebbe andare via - non c'è bisogno di modificare dallo script.

2021-11-15 19:39:31

Fantastico!!! Grazie. Ho modificato il tuo script molto minimamente a sostegno di una -NoExit interruttore. Lo si può trovare qui: github.com/visusys/VSYSFileOps/blob/main/Public/...
Jay

In altre lingue

Questa pagina è in altre lingue

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