Siguiendo buenos (aunque a veces contradictorios) consejos como
Comillas, caracteres de escape, delimitadores - Windows CMD - SS64.como
Carácter de escape - Wikipedia, sección 2.6 Windows_Command_Prompto incluso
El shell de comandos de Windows NTResolví el problema de escapar en aproximadamente un 99%, pero todavía estoy luchando con lo último. Mi caso de uso es especificar los argumentos de contraseña para descifrar o cifrar archivos pdf como parámetros de línea de comando qpdf.exe
, por lo que se esperan caracteres especiales y son bienvenidos. Si es posible, me gustaría poder utilizar más o menostodocaracteres imprimibles, con ESPACIO (U+0020) como único carácter de espacio en blanco.
No existe ningún nivel adicional de indirección, como canalizar los argumentos entre comandos o invocar un archivo por lotes; Todo lo que necesito producir es el comando "directo" para la línea de comando de Windows.
Esto es lo lejos que he llegado hasta ahora:
- Al contrario de lo que se menciona en el enlace SS64.com anterior,
COMMA
(U+002C),SEMICOLON
(U+003B) yEQUAL SIGN
(U+003D) no plantean ningún problema (al menos para mi caso de uso) - Simplemente poner todo en
QUOTATION MARKS
(U+0022) mientras se duplica lo preexistenteQUOTATION MARKS
(U+0022), no funciona correctamente ya que deja problemas con elPERCENT SIGN
(U+0025). - Además, el escape del cursor por sí solo no lo cubre todo. Es necesario mezclar los métodos.
Así es como procedo hasta ahora:
- Comillas dobles cualquiera
QUOTATION MARK
sólo "localmente", es decir, reemplaza cualquier U+0022 con U+0022 U+0022 U+0022 U+0022 - Cite cualquier valor
SPACE
sólo "localmente", es decir, reemplace U+0020 con U+0022 U+0020 U+0022 - Caret: escape del propio cursor, es decir, reemplace U+005E con U+005E U+005E
- Caret escapa de los caracteres especiales restantes (como se enumeran en los artículos vinculados), es decir, for
x
inLESS-THAN SIGN
(U+003C),GREATER-THAN SIGN
(U+003E),AMPERSAND
(U+0026),VERTICAL LINE
(U+007C),LEFT PARENTHESIS
(U+0028),RIGHT PARENTHESIS
( U+0029), reemplace cualquier aparición dex
con U+005Ex
. - Además, parece necesario escapar del cursor
PERCENT SIGN
, es decir, reemplazar cada U+0025 con U+005E U+0025.
Por lo tanto, para especificar una contraseña comoHello %TEMP%>"&abc
, terminaría con
C:\ruta\a\qpdf.exe --encrypt Hola" "^%TEMP^%^>""""^&abc contraseña de algún propietario 256 -- entrada.pdf salida.pdf
Esto funciona bien, es decir, la contraseña que necesito ingresar en la ventana de diálogo de contraseña al abrir el archivo output.pdf es efectivamenteHello %TEMP%>"&abc
Sólo hay un (hasta ahora) personaje malvado que desafía todos mis intentos de escapar de él: ¡el ASTERISK
(U+0042)! No funciona con comillas, duplicaciones, escapes de intercalación (u otros caracteres de escape que probé al azar); siempre intentará "globarse". En algunos casos, uno puede tener suerte si ningún archivo coincide con el globo, pero definitivamente necesito preguntarle a...
Pregunta.¿Cómo podría escapar de una contraseña deseada como*.*
(U+0042 U+002E U+0042) y evitar que se pegue?