Ejecutar el script de PowerShell a través del menú contextual del explorador en elementos que contienen símbolos en sus nombres

Ejecutar el script de PowerShell a través del menú contextual del explorador en elementos que contienen símbolos en sus nombres

Estoy usando una versión ligeramente modificada de la técnica dada enesta respuestapara crear un elemento del menú contextual en el explorador de archivos de Windows que me permita ejecutar un script de PowerShell en carpetas específicas.

El comando se parece a:

cmd /K PowerShell "C:\PowerShellScript\folder_script.ps1 \"%1\" | clip" 

Esto funciona bien excepto cuando la carpeta tiene un signo comercial (&) en su nombre. Luego aparece el siguiente error (la carpeta de destino tenía el nombre Testing & Testing):

The string starting:
At line:1 char:37
+ C:\PowerShellScript\folder_script.ps1  <<<< "E:\tmp\Testing
is missing the terminator: ".
At line:1 char:53
+ E:\Dropbox\PowerShell\namefixer.ps1 "E:\tmp\Testing  <<<<
    + CategoryInfo          : ParserError: (E:\tmp\Testing :String) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : TerminatorExpectedAtEndOfString

Claramente, algo está interpretando el signo comercial como un carácter especial, pero no sé cómo solucionar este problema. Eliminar el signo comercial del nombre de la carpeta no es una solución viable para mí.

Se preferiría una solución que no implique un script por lotes.

Estoy usando Windows 7 Enterprise (64 bits) con PowerShell 2.

Respuesta1

Puedes usar elmarcador palabra por palabrade Powershell: --%le dice a Powershell que todo lo que sigue no debe interpretarse.

De esta manera, tu comando sería:

cmd /K PowerShell "C:\PowerShellScript\folder_script.ps1 --% \"%1\" | clip" 

A menos que haya comillas dobles en los nombres de sus archivos, debería estar bien.

Este marcador es nuevo en Powershell 3.0, así que asegúrese de tenerlo actualizado.

Respuesta2

Puede intentar modificar su script de PowerShell. Y cambie la línea cmd a un archivo por lotes...

Su lote (runner.cmd)

set ps_arg="%~1"
@cd /d %~dp0
PowerShell "folder_script.ps1 | clip"

La segunda línea significa que establece la carpeta en la que se encuentra el archivo runner.cmd como la carpeta actual para que pueda ejecutar el script de PowerShell sin la ruta completa. Hace que sea más fácil mover cosas ya que no es necesario editar el archivo runner.cmd.

Y acceda a su ruta a través de lo siguiente en su script:

$value = $env:ps_arg -replace """",""

Las comillas del archivo por lotes parecen pasarse al script de PowerShell y es necesario eliminarlas, de ahí el archivo -replace """","". Como las comillas dobles son ilegales en los nombres de archivos de Windows, esto nunca eliminará nada importante.

Entonces, la línea de comando será

cmd /K runner.cmd "%1"

Respuesta3

Es una cuestión de cotización. Reemplace las comillas dobles con escape por comillas simples con escape para que su comando se vea así:

cmd /K PowerShell "C:\PowerShellScript\folder_script.ps1 \'%1\' | clip"

Está utilizando dos programas diferentes (cmd y powershell) y ejecutando tres fragmentos de código diferentes que pueden aceptar argumentos (cmd, powershell y el script .ps1).

cmd necesita tres argumentos: /K Powershell y los argumentos de powershell. Los argumentos de PowerShell deben ser una cadena, por eso están entre comillas.

Powershell necesita un argumento: la línea de comando que desea ejecutar.

El script .ps1 necesita un argumento: la carpeta donde se ejecutará. Powershell necesita interpretar la ruta como una sola cadena, por lo que debe estar entre comillas.

Cuando ejecuta el comando, cmd inicia Powershell y le envía la cadena entrecomillada con la variable expandida y sin comillas ni caracteres de escape:C:\PowerShellScript\folder_script.ps1 "Testing & Testing" | clip

Las comillas garantizan que el guión vea un argumento en lugar de tres.

(No estoy seguro de por qué los diferentes tipos de citas produjeron resultados diferentes (hasta donde yo sé, no deberían haberlo hecho), pero lo hicieron cuando lo probé, así que proporcioné la solución que funcionó en mi sistema. Si puede proporcionar más detalles, es posible que pueda encontrar una solución que funcione para usted también).

información relacionada