Aici este un simplu test de funcție numită 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
Dacă eu îi spun prin PS terminal, totul funcționează cum era de așteptat:
Exact apel: C:\Tools\scripts> .\RegistryBoundParams.ps1 -Target "C:\Test\" -MySwitch
Dacă eu îi spun prin registry (adăugarea de comanda pentru un meniu contextual), am obține:
pwsh -noexit -file "C:\Tools\scripts\RegistryBoundParams.ps1" -Target "C:\Program Files\Python39\python.exe" -MySwitch
Plaintext de eroare: RegistryBoundParams.ps1: A positional parameter cannot be found that accepts argument '$null'.
Aici e un reg care arată exact ceea ce am adăugat în registru:
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\""
Deci, undeva de-a lungul liniilor $Nul a trecut la script-ul, și nu am Idee de ce.
Mi-ar prinde bine niste ajutor.
Multumesc mult pentru orice sfat.
Edit:
Am constatat că, dacă am adăuga un nou șir variabilă numită $catchall, script-ul funcționează. Bănuiesc că atunci când a fost numit din registru este adăugarea o valoare nulă pentru un motiv oarecare. Care este motivul pentru script-ul funcționează atunci când am defini o suplimentare de "prinde-tot" variabilă.
Acest lucru nu este cu siguranta o solutie ideala la toate, așa că eu sunt încă în căutarea pentru o soluție aici. Apreciez orice ajutor!
Edit2:
Se pare că Request-AdminRights
scenariul l-am folosit mklement0 autorul a avut un bug care a fost acum fix. Oricine care vrea o linie auto altitudine cu bound/nelegat parametru susține că este cross-platform... du-te-l!