3

次のコードは、バッチ ファイルのすべてのコマンド ライン パラメータを取り込みます。私の場合、約 30 個のコマンド ライン パラメータがあり、それらはすべて 1、2、または 3 の数字です。それらを取り込んでから、それらを他の文字に再割り当てしたいと考えています。各 var が必要です。1 の場合は /* に変更し、2 の場合は */ に変更し、3 の場合は # に変更します。

最初の部分はうまく機能しますが、構文を取得できないのは再割り当ての2番目の部分です。

SETLOCAL ENABLEDELAYEDEXPANSION
set count=1
FOR %%i IN (%*) DO (
  set var!count!=%%i
  set var!count!=!var!count!:1=/*!  <--don't work
  set var!count!=!var!count!:2=*/!  <--don't work
  set var!count!=!var!count!:3=#!   <--don't work
  set /a count=!count!+1
)
4

2 に答える 2

2

問題は、配列メンバーへのアクセス方法です。

あなたの場合、最良の方法は一時変数を使用するようです。

SETLOCAL ENABLEDELAYEDEXPANSION
set count=1
FOR %%i IN (%*) DO (
  set "temp=%%i"
  set "temp=!temp:1=/*!"
  set "temp=!temp:2=*/!"
  set "temp=!temp:3=#!"
  set "var!count!=!temp!"
  set /a count+=1
)
于 2012-10-05T06:06:58.617 に答える
2

jeb が最も簡単な解決策だと思いますが、他にも選択肢があります。

1) count の現在の値を FOR 変数に転送できます。これが私がやりがちな方法です。

SETLOCAL ENABLEDELAYEDEXPANSION
set count=1
FOR %%i IN (%*) DO (
  for %%N in (!count!) do (
    set "var%%N=%%i"
    set "var%%N=!var%%N:1=/*!"
    set "var%%N=!var%%N:2=*/!"
    set "var%%N=!var%%N:3=#!"
  )
  set /a count+=1
)

2) CALL を使用して外部変数の展開を遅らせることができますが、通常の展開は遅延展開ほど安全ではないため、このオプションは好きではありません。

SETLOCAL ENABLEDELAYEDEXPANSION
set count=1
FOR %%i IN (%*) DO (
  set "var!count!=%%i"
  call set "var!count!=%%var!count!:1=/*%%"
  call set "var!count!=%%var!count!:2=*/%%"
  call set "var!count!=%%var!count!:3=#%%"
  set /a count+=1
)
于 2012-10-05T12:59:17.607 に答える