Nu puteți apela un script Powershell prin registrul corespunzător. O poziție parametru nu poate fi găsit, care acceptă argumentul '$nul'

0

Problema

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

enter image description here

enter image description here

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

enter image description here enter image description here enter image description here

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!

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

Cel mai bun răspuns

1

Problema a fost (din-fix) bug codul care v-ați bazat auto-funcția de ridicare Request-AdminRights pe:

Bug-ul a fost că, în cazul unui avansate de script, cum ar fi a ta, $args - care nu este legat în scripturi avansate - a fost eronat serializat ca $null în loc de tradus pentru @(), care rezultă în faptul că $null obtinerea a trecut ca un argument suplimentar privind re-invocare.

Dacă vă redefini Request-AdminRights funcția bazat pe acum actualizat corpul Ensure-Elevated funcția în original raspuns, problema ta ar trebui să meargă departe - nu este nevoie de a modifica anexând script.

2021-11-15 19:39:31

Minunat! Multumesc. Am modificat scriptul foarte minim pentru a sprijini o -NoExit comutator. Puteți găsi aici: github.com/visusys/VSYSFileOps/blob/main/Public/...
Jay

În alte limbi

Această pagină este în alte limbi

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