次のような良いアドバイス(時には矛盾することもあるが)に従うことで
引用符、エスケープ文字、区切り文字 - Windows CMD - SS64.comまたは
エスケープ文字 – Wikipedia、セクション 2.6 Windows_Command_Promptあるいは
Windows NT コマンド シェル、エスケープの問題は99%ほど解決しましたが、最後の部分ではまだ苦労しています。私の使用例は、pdfファイルの復号化または暗号化のためのパスワード引数をコマンドラインパラメータとして指定することなのでqpdf.exe
、特殊文字は予想され、歓迎されます。可能であれば、もっと多くまたは少なく使用できるようにしたいと思います。全て印刷可能な文字。スペース (U+0020) が唯一の空白文字です。
コマンド間で引数をパイプしたり、バッチ ファイルを呼び出したりするような間接的な追加レベルはありません。Windows コマンド ラインの「直接」コマンドを生成するだけで済みます。
これまでのところ、次のようになりました:
- 上記の SS64.com リンクに記載されていることとは反対に、
COMMA
(U+002C)、SEMICOLON
(U+003B)、EQUAL SIGN
(U+003D) は問題になりません (少なくとも私の使用例では) QUOTATION MARKS
既存の (U+0022) を 2 倍にして すべてを (U+0022) に入れるだけでは、少なくとも(U+0025)QUOTATION MARKS
に問題が残るため、正しく機能しません。PERCENT SIGN
- また、キャレットエスケープだけではすべてをカバーできません。複数の方法を組み合わせる必要があります。
これまでのところ、私はこのように進めています:
- 二重引用符は
QUOTATION MARK
「ローカル」にのみ使用します。つまり、U+0022 を U+0022 に置き換えます。U+0022 U+0022 U+0022 - any を「ローカル」にのみ引用符で囲みます
SPACE
。つまり、U+0020 を U+0022 に置き換えます。U+0020 U+0022 - キャレット自体をキャレットエスケープします。つまり、U+005EをU+005Eに置き換えます。U+005E
- 残りの特殊文字はキャレットでエスケープします (リンクされた記事に記載されているとおり)。つまり、
x
(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) の は、出現するすべての文字をx
U+005E に置き換えますx
。 PERCENT SIGN
さらに、キャレットエスケープ、つまりすべてのU+0025をU+005E U+0025に置き換える必要があるようです。
次のようなパスワードを指定するにはHello %TEMP%>"&abc
、私は結局
C:\path\to\qpdf.exe --encrypt Hello" "^%TEMP^%^>""""^&abc someownerpassword 256 -- input.pdf output.pdf
これはうまく機能します。つまり、output.pdfを開くときにパスワードダイアログウィンドウに入力する必要があるパスワードは確かにHello %TEMP%>"&abc
今のところ、私が試みたすべてのエスケープの試みに反する悪質な文字が 1 つだけあります。それはASTERISK
(U+0042) です。引用符、二重引用符、キャレット エスケープ (またはランダムに試した他のエスケープ文字) はどれも機能しません。常に「グロブ」を試みます。場合によっては、どのファイルもグロブに一致しない場合は幸運なこともありますが、必ず専門家に問い合わせる必要があります...
質問。次のようなパスワードをエスケープするにはどうすればいいでしょうか?*.*
(U+0042 U+002E U+0042) にしてグロブを防ぐことはできますか?