¿Cómo escapar correctamente en el shell de comandos de Windows, incluso el asterisco?

¿Cómo escapar correctamente en el shell de comandos de Windows, incluso el asterisco?

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) y EQUAL 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 preexistente QUOTATION MARKS(U+0022), no funciona correctamente ya que deja problemas con el PERCENT 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:

  1. Comillas dobles cualquiera QUOTATION MARKsólo "localmente", es decir, reemplaza cualquier U+0022 con U+0022 U+0022 U+0022 U+0022
  2. Cite cualquier valor SPACEsólo "localmente", es decir, reemplace U+0020 con U+0022 U+0020 U+0022
  3. Caret: escape del propio cursor, es decir, reemplace U+005E con U+005E U+005E
  4. Caret escapa de los caracteres especiales restantes (como se enumeran en los artículos vinculados), es decir, for xin LESS-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 de xcon U+005E x.
  5. 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?

información relacionada