Nemůžeš říkat, že Powershell skript prostřednictvím registru správně. Poziční parametr nelze nalézt, který přijímá argument '$null,'

0

Otázka

Zde je jednoduchý test funkce tzv. 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

Pokud mám hovor přes PS, svorka, vše funguje jak má:

Přesný volání: C:\Tools\scripts> .\RegistryBoundParams.ps1 -Target "C:\Test\" -MySwitch

enter image description here

enter image description here

Pokud mám hovor přes registry (přidat příkaz do kontextového menu), dostanu:

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 chybu: RegistryBoundParams.ps1: A positional parameter cannot be found that accepts argument '$null'.

Tady je soubor s příponou reg, který ukazuje přesně to, co jsem si přidal v 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\""

Takže někde podél čáry $Null je předán skriptu, a já nemám Ponětí, proč.

Mohl bych opravdu použít nějakou pomoc zde.

Díky moc za jakoukoliv radu.

Edit:


Zjistil jsem, že když jsem přidat nový řetězec proměnné s názvem $všehochuť, skript funguje. Mám podezření, že když je volána z registru, že je to připojením hodnotu null pro některé důvod. Což je důvod, proč skript funguje, když jsem definovat další "chytit všechny" proměnné.

To rozhodně není ideální řešení, takže jsem stále hledal řešení. Opravdu oceňuji jakoukoliv pomoc!

Edit2:


Ukazuje se, že Request-AdminRights skript byl jsem pomocí to mklement0 autorem měl chybu, že byl nyní vyřešen. Každý, kdo chce-line self průčelí s vázané/nevázané parametr podporu, která je cross-platform... jít si to!

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

Nejlepší odpověď

1

Problém byl (od-pevné) chyba v kódu, který vám na základě vašeho self-povznášející funkce Request-AdminRights na:

Chyba byla, že v případě pokročilé skriptu, jako je to vaše, $args - což není nikdy vázán v pokročilé skripty - byl mylně serializován jako $null místo přeloženy do @(), což vede k, že $null jak prošel jako další argument na opětovné vyvolání.

Pokud se vám definovat vaše Request-AdminRights funkce na základě nyní aktualizován tělo Ensure-Elevated funkce v původní odpověď, tvůj problém by měl jít pryč - není třeba upravit obvodových scénář.

2021-11-15 19:39:31

Úžasné! Díky. Upravil jsem skript minimálně na podporu -NoExit spínač. Můžete ji najít zde: github.com/visusys/VSYSFileOps/blob/main/Public/...
Jay

V jiných jazycích

Tato stránka je v jiných jazycích

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