バックスラッシュがコールアウト コマンド ラインの一部になっている場合、Site Recovery Manager はすべてのバックスラッシュを倍にします。

問題

コマンドライン システム インタプリタは、ファイル パスの場合にのみ、二重バックスラッシュを一重バックスラッシュとして扱います。コールアウト コマンドでファイル パス以外のパラメータでバックスラッシュを 1 つ必要とし、そのコマンドが二重バックスラッシュを一重バックスラッシュに変換しない場合、そのコールアウト コマンドはエラーを出力して失敗します。

たとえば、1 つのコールアウト手順をワークフローに追加し、次のテキストをコマンドとして入力します。
c:\Windows\system32\cmd.exe /C "C:\myscript.cmd" a/b/c \d\e\f \\g\\h c:\myscript.log
このコールアウト手順の結果、 Site Recovery Manager は次のコマンドを実行します。
c:\\Windows\\system32\\cmd.exe /C "C:\\myscript.cmd" a/b/c \\d\\e\\f \\\\g\\\\h c:\\myscript.log

myscript.cmd が二重バックスラッシュを一重バックスラッシュに変更せず、\d\e\f パラメータと \\g\\h パラメータがバックスラッシュの数を区別する場合、myscript.cmd は失敗します。

解決方法

  1. 追加のコマンドライン バッチ ファイルを作成して、コマンドとすべての必須パラメータを含めます。コールアウト手順は、引数を何も指定せずにこの追加バッチ ファイルを実行します。たとえば、ソリューションは次のようになります。
    1. メモ帳などのテキスト エディタで、C:\myscript.cmd a/b/c \d\e\f \\g\\h c:\myscript.log をコンテンツとする c:\SRM_callout.cmd ファイルを作成します。
    2. リカバリ プランのコールアウト手順で、次のように実行するコマンドを入力します。 c:\\Windows\\system32\\cmd.exe /C c:\SRM_callout.cmd
  2. 元のスクリプト ファイルに、二重バックスラッシュを一重バックスラッシュで置換するコードを追加します。
    1. スクリプト ファイル c:\myscript.cmd の先頭に、次のサンプルに似たコードを追加します。
      @echo off
      set arg2=%2
      set arg3=%3
      set fixed_arg2=%arg2:\\=\%
      set fixed_arg3=%arg3:\\=\%
      
      スクリプトで shift コマンドを使用する場合は、バックスラッシュの数を区別するすべてのパラメータがこのように扱われます。
    2. スクリプトで shift コマンドを使用しない場合は、次のように変更します。

      %2%fixed_arg2% で置き換えます。

      %3%fixed_arg3% で置き換えます。

    3. コールアウト手順のコマンドは変更しないでください。