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
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
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!