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
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
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!