2

RSA ソフト トークンの変換を自動化し、変換文字列を Outlook に渡しています。Outlook コマンド ラインへのバッチを使用して文字列を URL にすることはできませんが、それは私の問題ではありません。私の問題は、厄介な等号を URL エンコードされた同等の "%3D" に変換することです。

@echo off
setlocal enableDelayedExpansion

set /p fname=Enter the Filename:
set /p pss=Enter the encryption pass:

IF NOT EXIST "%fname%".sdtid (
echo File Not Found!  Closing...
PING 1.1.1.1 -n 4 >NUL
exit
)

echo File Found! starting process...

REM tokenconverter %fname%.sdtid -iphone >> temp_batch.txt
tokenconverter %fname%.sdtid -p %pss% -iphone >> temp_batch.txt

set /p result= < temp_batch.txt
DEL temp_batch.txt
REM %result% | clip

set "stringclean1=!result:?=%%3F!"
set "stringclean2=!stringclean1::=%%3A!"
set "stringclean3=!stringclean2:/=%%2F!"

次の行は、等号のエンコードに失敗しています。

 set "stringclean4=!stringclean3:==%%3D!"

私はもう試した:

 set "stringclean4=!stringclean3:=^=%%3D!"
 set "stringclean4=!stringclean3:=%=%%3D!"

ただし、等号はエンコードされないままです。

echo Piping over to outlook..
REM passing stringclean3 since stringclean4 no worky.
pushd "C:\Program Files\Microsoft Office\Office12"
outlook.exe /c ipm.note /m "&subject=TEsT&body=%stringclean3%"

遅延変数展開を使用して等号を URL エンコードする適切な方法は何ですか?

任意の支援をいただければ幸いです。前もって感謝します。

4

3 に答える 3

3

申し訳ありませんが、バッチで置き換えるための簡単な解決策は=単に存在しません:-(

純粋なバッチを使用して実行できる最善の方法は、文字列を 1 文字ずつループし、必要に応じて置換することです。

これは、さらに最適化する余地のあるブルート フォース ソリューションです。しかし、それで十分です。=時間をかけてエンコードする前に、まず存在するかどうかを確認します=

:: test if string contains =
:: only take the time to encode = if it exists
set "test=a!stringClean3!"
for /f "delims=" %%S in ("!test!") do if /i "!test:%%S=%%S!" neq "!test!" (

  :: compute length of string - 1
  set end=0
  for /l %%A in (12,-1,0) do (
    set /a "end|=1<<%%A"
    for %%B in (!end!) do if "!stringClean3:~%%B,1!"=="" set /a "end&=~1<<%%A"
  )

  :: replace = with %3D
  for /l %%N in (0 1 !end!) do (
    if "!stringClean3:~%%N,1!" equ "=" (
      set "stringClean4=!stringClean4!%%3D"
    ) else (
      set "stringClean4=!stringClean4!!stringClean3:~%%N,1!"
    )
  )

) else set stringClean4=!stringClean3!


編集

これは、CERTUTIL を使用して文字列を 16 進数としてエンコードおよびデコードする別のまったく異なるアプローチです。16 進文字列をエンコードするのは簡単なことです。CERTUTIL が XP に付属しているとは思えません。よく覚えていませんが、CERTUTIL の構文は Windows のバージョンによって若干変わる可能性があります。これをVistaで開発およびテストしました。

set "tempFile=%temp%\replaceEqual%random%"

(>"%tempFile%.before" echo(!stringClean3!)
certutil -encodehex "%tempFile%.before" "%tempFile%.hex" >nul
>"%tempFile%.hex2" (
  for /f "usebackq tokens=1*" %%A in ("%tempFile%.hex") do (
    set ln=%%B
    set "ln=!ln:~0,48!"
    (echo !ln:3d=25 33 44!)
  )
)
certutil -decodehex "%tempFile%.hex2" "%tempFile%.after" >nul
<"%tempFile%.after" set /p "stringClean4="
del "%tempFile%.*"

SET /P を使用して結果を読み取ると、次の制限が生じます。

  • 文字列の長さは 1021 文字以下にする必要があります。
  • 文字列は制御文字で終わってはなりません (末尾の制御文字は削除されます)
  • 文字列に改行を含めることはできません

結果は FOR /F を使用して読み取ることができますが!、FOR 変数が展開されると、遅延展開によってすべてが破損します。

于 2013-03-07T02:41:37.233 に答える
3

dbenham は、JScript の encodeURIComponent メソッドの使用について良い考えを持っていました。OPのサンプルスクリプトに詰め込まれています:

@echo off
setlocal

set /p fname=Enter the Filename:
set /p pss=Enter the encryption pass:

IF NOT EXIST "%fname%".sdtid (
    echo File Not Found!  Closing...
    PING 1.1.1.1 -n 4 >NUL
    exit
)

echo File Found! starting process...

echo WScript.Stdout.WriteLine(encodeURIComponent(WScript.StdIn.ReadLine()));>uri.js
for /f "delims=" %%I in (
    'tokenconverter %fname%.sdtid -p %pss% -iphone ^| cscript /nologo uri.js'
) do set "result=%%I"
del uri.js
于 2013-03-07T13:03:06.110 に答える
0
SET result=qm?colon:slash/equal=qm?colon:slash/equal=end
set "stringclean0=!result!"
:loop3D
FOR /f "tokens=1,2*delims==" %%i IN ('SET stringclean0') DO (
  IF NOT "%%k"=="" set stringclean0=%%j%%3D%%k&GOTO loop3D
)
set "stringclean1=!stringclean0:?=%%3F!"
set "stringclean2=!stringclean1::=%%3A!"
set "stringclean3=!stringclean2:/=%%2F!"

SET stri
于 2013-03-07T04:37:55.137 に答える