No puede llamar a un script de Powershell a través del registro correctamente. Un parámetro de posición no se puede encontrar que acepta el argumento de '$null,'

0

Pregunta

Aquí está una prueba simple de la función de llamada 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

Si me llaman a través de la PS terminal, todo funciona como se espera:

Exacto llamar a: C:\Tools\scripts> .\RegistryBoundParams.ps1 -Target "C:\Test\" -MySwitch

enter image description here

enter image description here

Si me llaman a través del registro (agregar el comando a un menú de contexto), me sale:

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

Texto del error: RegistryBoundParams.ps1: A positional parameter cannot be found that accepts argument '$null'.

He aquí un archivo reg que muestra exactamente lo que he añadido en el registro:

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

Así que en algún lugar a lo largo de las líneas de $Null se pasa a la secuencia de comandos, y no tengo Idea de por qué.

Yo podría realmente utilizar un poco de ayuda aquí.

Muchas gracias por cualquier orientación.

Editar:


He encontrado que si puedo agregar una nueva variable de cadena llamada $cajón de sastre, el script funciona. Sospecho que cuando se llama desde el registro es añadiendo un valor nulo por alguna razón. Es por eso que el script funciona cuando defino un adicional de "catch all" de la variable.

Este definitivamente no es una solución ideal a todos, así que todavía estoy buscando una solución a este problema. Realmente apreciamos cualquier ayuda!

Edit2:


Resulta que el Request-AdminRights secuencia de comandos que estaba usando en ese mklement0 autor tenía un error que ya se ha solucionado. Cualquier persona que quiera tener una línea de auto de elevación con enlazados/parámetro independiente de apoyo que de la cruz-plataforma de... ir a por él!

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

Mejor respuesta

1

El problema era (puesto fijo) error en el código que ha basado su auto-elevación de la función Request-AdminRights en:

El error fue que en el caso de una avanzada de la escritura, tales como la suya, $args - que nunca es obligado en la avanzada de secuencias de comandos - fue erróneamente serializado como $null en lugar de traducir a @(), lo que resulta en que $null te pasó como un argumento extra en la re-invocación.

Si usted redefinir su Request-AdminRights función que se basa en el ahora actualizado cuerpo de la Ensure-Elevated función en la respuesta original, el problema debe desaparecer - no hay necesidad de modificar la envolvente de secuencia de comandos.

2021-11-15 19:39:31

Impresionante! Gracias. He modificado el script muy poco para apoyar una NoExit interruptor. Usted puede encontrar aquí: github.com/visusys/VSYSFileOps/blob/main/Public/...
Jay

En otros idiomas

Esta página está en otros idiomas

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