Saltar al contenido

Arrastrar y soltar en un script de Powershell

Solución:

Me doy cuenta de que esta pregunta tiene un par de años, pero como sigue siendo el resultado principal para muchas consultas de Google relacionadas con la ejecución de PowerShell a través de un explorador de arrastrar y soltar, pensé que publicaría lo que se me ocurrió hoy en la esperanza de que ayude a otros.

Quería poder arrastrar y soltar archivos en scripts de PowerShell (ps1) y no pude encontrar ninguna buena solución (nada que no implique un script o acceso directo adicional). Comencé a hurgar en los asociados de archivos en el Registro y se me ocurrió algo que parece funcionar perfectamente.

Primero, debemos agregar una entrada DropHandler para archivos .PS1 para que Explorer sepa que los archivos PS1 deben aceptar operaciones de arrastrar y soltar. Haga eso con este cambio de registro. Probablemente tendrá que crear las subclaves ShellEx y DropHandler.

HKEY_CLASSES_ROOTMicrosoft.PowerShellScript.1ShellExDropHandler
(Default) = {60254CA5-953B-11CF-8C96-00AA00B8708C}

Este controlador de caída es el que utiliza Windows Scripting Host. Es mi primera opción porque admite nombres de archivo largos. Si tiene problemas con los espacios u otra cosa, puede probar el controlador de caída estándar Shell32 ejecutable (.exe, .bat, etc.): {86C86720-42A0-1069-A2E8-08002B30309D}.

Ambos controladores de caída funcionan simplemente invocando el verbo predeterminado (lo que sucede cuando hace doble clic en un archivo) para el tipo de archivo (visto como el (Default) valor de la clave Shell). En el caso de archivos PS1, esto es Abierto. De forma predeterminada, este verbo muestra el script de PowerShell en el Bloc de notas, lo que no es muy útil.

Cambie este comportamiento modificando el verbo Open para archivos PS1:

HKEY_CLASSES_ROOTMicrosoft.PowerShellScript.1ShellOpenCommand
(Default) = "C:WindowsSystem32WindowsPowerShellv1.0powershell.exe" -NoExit -File "%1" %*

Esto ejecutará el script en PowerShell cuando se abra y le pasará todos los parámetros (archivos soltados). Lo tengo configurado para permanecer abierto después de que se complete la secuencia de comandos, pero puede cambiar esto eliminando el -NoExit opción.

Eso es todo. No he realizado pruebas exhaustivas, pero hasta ahora parece estar funcionando muy bien. Puedo soltar archivos / carpetas individuales así como grupos. El orden de los archivos en la lista de parámetros no siempre es el que cabría esperar (una peculiaridad de cómo Explorer ordena los archivos seleccionados), pero aparte de eso, parece ideal. También puede crear un acceso directo a un archivo PS1 en Shell:Sendto, lo que le permite pasar archivos mediante el menú Enviar a.

Aquí están los dos cambios en el formato de archivo REG:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOTMicrosoft.PowerShellScript.1ShellExDropHandler]
@="{60254CA5-953B-11CF-8C96-00AA00B8708C}"

[HKEY_CLASSES_ROOTMicrosoft.PowerShellScript.1ShellOpenCommand]
@=""C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -NoExit -File "%1" %*"

Notas:

  • Como resultado de estos cambios, al hacer doble clic en un archivo PS1 en el Explorador se ejecutará el script; para editar en lugar de abrir, tendrá que usar el menú contextual. Y solo como una sugerencia (tristemente aprendida de la amarga experiencia :), podría considerar un guardia de confirmación / comprobación de cordura si tiene scripts que toman acciones dañinas.

  • Los scripts que se ejecutan mediante acciones de arrastrar y soltar tendrán un directorio de trabajo inicial predeterminado de C:Windowssystem32. Otra razón para tener cuidado.

  • Recuerde que deberá cambiar su Política de ejecución (Set-ExecutionPolicy) a menos que esté utilizando scripts firmados.

  • Si ha ajustado el manejo de archivos .PS1 en Windows 10, debe eliminar la clave de registro HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerFileExts.ps1UserChoice que anulará el manejo predeterminado.

La forma más fácil de pasar archivos o carpetas a un script de Powershell es un script de contenedor como el siguiente:

@echo off
rem the name of the script is drive path name of the Parameter %0
rem (= the batch file) but with the extension ".ps1"
set PSScript=%~dpn0.ps1
set args=%1
:More
shift
if '%1'=='' goto Done
set args=%args%, %1
goto More
:Done
powershell.exe -NoExit -Command "& '%PSScript%' '%args%'"

Todo lo que tienes que hacer es

hacer una copia del archivo .bat

asígnele el mismo nombre que el archivo de script pero con la extensión .bat

Por ejemplo, “hola.ps1” <--> “hola.bat”

Suelta los archivos / carpetas en el archivo por lotes y los pasará al script.

Un código de secuencia de comandos de muestra puede verse así:

"hello world"
$args
$args.Gettype().Fullname

El secreto durante todo este tiempo, desde que estuvo disponible, ha sido el atributo de parámetro “ValueFromRemainingArguments”.

Atajo

powershell.exe -noexit -file c:Test.ps1

Test.ps1

[CmdletBinding()]
param (
    [Parameter(ValueFromRemainingArguments=$true)]
    $Path
)

'Paths'
$Path
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *