Nie można poprawnie wywołać skrypt Powershell przez rejestr. Nie można znaleźć pozycyjny parametr przyjmuje argument "$null"

0

Pytanie

Oto prosty test funkcja, zwana 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

Jeśli wezwę go przez terminal PS, wszystko będzie działać tak, jak oczekiwano:

Dokładny wyzwanie: C:\Tools\scripts> .\RegistryBoundParams.ps1 -Target "C:\Test\" -MySwitch

enter image description here

enter image description here

Jeśli wezwę go przez rejestr (dodając polecenie w menu kontekstowym), otrzymam:

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

Odkryty tekst błędu: RegistryBoundParams.ps1: A positional parameter cannot be found that accepts argument '$null'.

Oto plik reg, w którym pokazano, że właśnie dodałem do rejestru:

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

W ten sposób, gdzieś w wierszach $Null przekazywane scenariusza, i nie mam pojęcia, dlaczego.

Chciałbym bardzo, bardzo nie przeszkodziła pomoc tutaj.

Bardzo dziękuję za wszelkie wskazówki.

Edytuj:


Odkryłem, że gdy dodam nowy ciąg zmienną o nazwie $catchall, skrypt będzie działać. Podejrzewam, że podczas rozmowy z rejestru on z jakiegoś powodu dodaje wartość zero. Dlatego skrypt działa, gdy oceniłem dodatkową zmienną "złapać wszystkie".

To na pewno nie jest idealne rozwiązanie, dlatego ciągle szukam rozwiązanie tutaj. Naprawdę doceniam każdą pomoc!

Правка2:


Okazuje się, że Request-AdminRights w scenariuszu, który używałem, utworzonym mklement0, był błąd, który teraz naprawić. Każdy, kto chce однострочное samodzielne podnoszenie związanych z obsługą/niezależnych parametrów, który jest cross-platform... idź i zdobądź go!

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

Najlepsza odpowiedź

1

Problem polegał na (poprawiona z tego czasu) błąd w kodzie, na której założyli swoją funkcję самоподъема Request-AdminRights na:

Błąd polegał na tym, że w przypadku zaawansowanego skryptu, takiego jak twój, $args - który nigdy nie przywiązuje się w zaawansowanych scenariuszach - został błędnie serializowany jak $null zamiast tłumaczenia na @()w wyniku czego $null transmisja jako dodatkowy argument przy ponownym połączeniu.

Jeśli należy zmienić swój Request-AdminRights funkcja oparta na nowym tekście Ensure-Elevated funkcja w oryginalnym odpowiedzi, problem powinien zniknąć - nie ma potrzeby zmieniać zawierający skrypt.

2021-11-15 19:39:31

Super! Dziękuję. Zmieniłem swój scenariusz bardzo minimalnie, aby utrzymać przełącznik-NoExit. Można go znaleźć tutaj: github.com/visusys/VSYSFileOps/blob/main/Public/...
Jay

W innych językach

Ta strona jest w innych językach

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