Powershell komut dosyasını kayıt defterinden düzgün bir şekilde çağıramazsınız. '$null'argümanını kabul eden konumsal bir parametre bulunamıyor

0

Soru

İşte adı verilen basit bir test işlevi 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

PS terminali üzerinden çağırırsam, her şey beklendiği gibi çalışır:

Tam çağrı: C:\Tools\scripts> .\RegistryBoundParams.ps1 -Target "C:\Test\" -MySwitch

enter image description here

enter image description here

Kayıt defteri aracılığıyla çağırırsam (komutu bir içerik menüsüne eklersem), şunu alırım:

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

Hatanın düz metni: RegistryBoundParams.ps1: A positional parameter cannot be found that accepts argument '$null'.

İşte kayıt defterine tam olarak ne eklediğimi gösteren bir reg dosyası:

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

Yani satırlar boyunca bir yerde $Null komut dosyasına aktarılıyor ve neden olduğu hakkında hiçbir fikrim yok.

Ama çok ihtiyacım var yardıma kullanın.

Herhangi bir rehberlik için çok teşekkürler.

Düzenlemek:


$Catchall adlı yeni bir dize değişkeni eklersem, komut dosyasının çalıştığını gördüm. Kayıt defterinden çağrıldığında, bir nedenden dolayı boş bir değer eklediğinden şüpheleniyorum. Bu yüzden ek bir "tümünü yakala" değişkeni tanımladığımda komut dosyası çalışır.

Bu kesinlikle ideal bir çözüm değil, bu yüzden hala burada bir çözüm arıyorum. Herhangi bir yardım gerçekten takdir!

Düzen2:


Bu çıkıyor Request-AdminRights mklement0 tarafından yazılan komut dosyasında şu anda düzeltilen bir hata vardı. Çapraz platform olan bağlı/ilişkisiz parametre desteği ile tek satırlık kendini yükseltmek isteyen herkes... git getir!

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

En iyi cevabı

1

Sorun, kendi kendini yükselten işlevinizi temel aldığınız kodda (düzeltildiğinden beri) bir hataydı Request-AdminRights üzerinde:

Hata, sizinki gibi gelişmiş bir komut dosyası durumunda, $args - gelişmiş komut dosyalarında hiçbir zaman bağlı olmayan-yanlışlıkla seri hale getirildi $null tercüme etmek yerine @(), bununla sonuçlanır $null yeniden çağırma konusunda ek bir argüman olarak geçiliyor.

Eğer sizinkini yeniden tanımlarsanız Request-AdminRights şimdi güncellenen gövdeye dayanan işlev Ensure-Elevated işlev orijinal yanıtta, sorununuz ortadan kalkmalıdır - çevreleyen komut dosyasını değiştirmeye gerek yoktur.

2021-11-15 19:39:31

Müthiş! Teşekkürler. A-NoExit anahtarını desteklemek için komut dosyanızı çok az değiştirdim. Burada bulabilirsiniz: github.com/visusys/VSYSFileOps/blob/main/Public/...
Jay

Diğer dillerde

Bu sayfa diğer dillerde

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