Estoy usando el siguiente código para enviar algunas claves para automatizar algún proceso en mi empresa.

$wshell = New-Object -ComObject wscript.shell;

$wshell.SendKeys("here comes my string");

El problema es que la cadena que se envía debe desinfectarse para escapar de algunos caracteres especiales como se describe aquí.

Por ejemplo: {, [, +, ~ todos esos símbolos deben ser de escape como {{}, {[}, {+}, {~}

Entonces me pregunto: ¿hay alguna forma fácil / limpia de hacer un reemplazo en la cadena? No quiero usar toneladas de string.replace("{","{{}"); string.replace("[","{[}")

¿Cuál es la forma correcta de hacer esto?

-2
TESTE 17 feb. 2018 a las 02:36

2 respuestas

La mejor respuesta

Puede usar una expresión regular (RegEx para abreviar) para hacer esto. La expresión regular se utiliza para la coincidencia de patrones y funciona muy bien para lo que necesita. Irónicamente, necesitará escapar los caracteres para la expresión regular antes de definir el patrón de expresión regular, por lo que crearemos una matriz de caracteres especiales, los escaparemos, los uniremos todos con | (que indica OR) y luego reemplácelo con el operador -replace.

$SendKeysSpecialChars = '{','}','[',']','~','+','^','%'
$ToEscape = ($SendKeysSpecialChars|%{[regex]::Escape($_)}) -join '|'
"I need to escape [ and } but not # or !, but I do need to for %" -replace "($ToEscape)",'{$1}'

Eso produce:

I need to escape {[} and {}} but not # or !, but I do need to for {%}

Simplemente coloque los dos primeros cerca del comienzo del script, luego use el reemplazo según sea necesario. O crea una función a la que puedas llamar que se encargue del reemplazo y la llamada de SendKeys por ti.

0
TheMadTechnician 17 feb. 2018 a las 00:39

Puede utilizar Here Strings .

Nota: Here Strings se diseñaron para cadenas de varias líneas, pero aún puede usarlas para escapar de los caracteres de expresión.

Como se indica en this sitio web.

Una cadena aquí es una cadena entre comillas simples o entre comillas dobles que puede abarcar varias líneas. Las expresiones en cadenas de comillas simples no se evalúan.

Todas las líneas de una cadena aquí se interpretan como cadenas, aunque no estén entre comillas.

Ejemplo:


Para declarar una cadena aquí, debe usar una nueva línea para el texto en sí, sintaxis de Powershell.

$string = @'
{ [ + ~ ! £ $ % ^ & ( ) _ - # ~ @ '' "" 
'@

Salida: { [ + ~ ! £ $ % ^ & ( ) _ - # ~ @ '' ""

0
Alex 17 feb. 2018 a las 00:12