Nemôže zavolať Powershell skriptu prostredníctvom databázy registry správne. Polohové parameter nie je možné nájsť, že akceptuje argument '$null'

0

Otázka

Tu je jednoduchý test funkcia sa nazýva 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

Ak som volať cez PS terminálu, všetko funguje tak, ako sa očakáva:

Presný hovoru: C:\Tools\scripts> .\RegistryBoundParams.ps1 -Target "C:\Test\" -MySwitch

enter image description here

enter image description here

Ak som volať to prostredníctvom databázy registry (pridaním príkazu na kontextové menu), som si:

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

Forme obyčajného textu chyby: RegistryBoundParams.ps1: A positional parameter cannot be found that accepts argument '$null'.

Tu je reg súbor, ktorý ukazuje presne to, čo som pridané do databázy registry:

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

Takže niekde pozdĺž línie $Null je, že prešiel na skript, a ja netuším prečo.

Mohol by som naozaj, naozaj využiť nejakú pomoc tu.

Díky moc za všetky pokyny.

Úprava:


Zistil som, že keď pridám nový reťazec premenná s názvom $catchall, skript funguje. Mám podozrenie, že, keď je volaná z databázy registry je to pridaním null hodnotu z nejakého dôvodu. Čo je dôvod, prečo skript funguje, keď som definovať ďalšie "chytiť všetky" premennej.

To určite nie je ideálne riešenie na všetko, takže som stále hľadá riešenie tu. Naozaj ocenia pomoc!

Edit2:


Ukazuje sa, že Request-AdminRights skript bol som pomocou to, že mklement0 autorom mal bug, ktorý bol opravený. Každý, kto chce jeden-line samostatne fasáda s viazaný/neviazané parameter podporu, ktorá je cross-platform... choď si ho!

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

Najlepšiu odpoveď

1

Problém bol (od-pevné) chýb v kóde, ktorý vám na základe vašich self-povýšenie funkcia Request-AdminRights o:

Bola chyba, že v prípade rozšírené skript, ako je tá vaša, $args - čo je nikdy viazané v pokročilé skripty - bol omylom na pokračovanie ako $null namiesto preložené do @()a výsledkom, ktoré $null získanie prešiel ako ďalší argument na re-vzývanie.

Ak ste nanovo definovať svoje Request-AdminRights funkcie založené na teraz aktualizované tela Ensure-Elevated funkcia v pôvodnú odpoveď, váš problém by mal ísť preč, nie je potrebné upravovať prikladať skriptu.

2021-11-15 19:39:31

Úžasné! Vďaka. Som upravil skript veľmi minimálne na podporu -NoExit prepínač. Nájdete ho tu: github.com/visusys/VSYSFileOps/blob/main/Public/...
Jay

V iných jazykoch

Táto stránka je v iných jazykoch

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