這是一個簡單的測驗函式,稱為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 終端呼叫它,一切都會按預期進行:
準確呼叫: C:\Tools\scripts> .\RegistryBoundParams.ps1 -Target "C:\Test\" -MySwitch


如果我通過注冊表呼叫它(將命令添加到背景關系選單),我會得到:
pwsh -noexit -file "C:\Tools\scripts\RegistryBoundParams.ps1" -Target "C:\Program Files\Python39\python.exe" -MySwitch

錯誤的明文: RegistryBoundParams.ps1: A positional parameter cannot be found that accepts argument '$null'.
這是一個 reg 檔案,它顯示了我在注冊表中添加的內容:
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\""
所以沿著 $Null 行的某個地方被傳遞給腳本,我不知道為什么。
我真的可以在這里使用一些幫助。
非常感謝您的任何指導。
編輯:
我發現如果我添加一個名為 $catchall 的新字串變數,腳本就可以作業。我懷疑當從注冊表中呼叫時,它出于某種原因附加了一個空值。這就是當我定義一個額外的“catch all”變數時腳本作業的原因。
這絕對不是一個理想的解決方案,所以我仍然在這里尋找解決方案。真的很感激任何幫助!
編輯2:
事實證明,Request-AdminRights我使用的 mklement0 撰寫的腳本有一個現在已修復的錯誤。任何想要具有跨平臺系結/未系結引數支持的單線自我提升的人......去吧!
uj5u.com熱心網友回復:
問題是代碼中的(自修復以來)錯誤,您的自提升功能基于該錯誤Request-AdminRights:
錯誤在于,在像您這樣的高級腳本的情況下,$args它永遠不會在高級腳本中系結 - 被錯誤地序列化為$null而不是翻譯為@(),導致在$null重新呼叫時作為額外引數傳遞。
如果您Request-AdminRights根據原始答案中現在更新的Ensure-Elevated函式體重新定義函式,您的問題應該會消失 - 無需修改封閉腳本。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/357870.html
