1

各列の最大長を取得するスクリプトに取り組んでいます。最大長を _c1...n 変数に格納しようとしています。列数不明。

各列の長さを取得し、set _c!i! でそれぞれを格納する変数を作成することができました。= !n!、n は長さですが、特定の列の最大長を設定するには、現在と最大を比較して、!_c!!i!! のようなものを使用する必要があります。これは機能しません。名前のどの部分が別の変数に由来する変数を参照するかについてのアイデアはありますか?

ありがとう...

4

3 に答える 3

2

括弧「()」のセット内で作業しているため、遅延展開文字を使用していると思います。それを行うと、プロセスが難しくなります。メソッドの方が読みやすいことはわかっていますが、コーディングするのは難しいです。

括弧内では、1 つ以上の変数から「構築」された変数にアクセスする方法を 1 つだけ知っています。つまり、call関数を使用して、アセンブルされた変数を「アクティブ化」します。このメソッドは、括弧の内側と外側の両方で機能します。

以下に小さな例を示します。

@echo off
setlocal enabledelayedexpansion
(
  set i=10
  set _c!i!=something
  :: below is equivalent to echo !_c10!
  call echo %%_c!i!%%
)
endlocal

出力:

something

CALLXP 以前では、FIND.EXE のような内部コマンドを呼び出すことはできず、 FIND.EXEifのような「外部」プログラムのみを呼び出すことができます。

おそらくステートメントを使用して括弧のセットの外で作業できる場合はcall :label、次のように変数に簡単にアクセスできます。

@echo off
setlocal enabledelayedexpansion
set i=10
set _c!i!=something

:: The below 2 statements are equivalent to `echo %_c10%`
echo !_c%i%!
call echo %%_c!i!%%

endlocal

出力:

something
something
于 2012-08-28T00:14:17.213 に答える
2

James K によって提案された CALL 手法は機能しますが、比較的遅く、変数の内容によっては安全ではない可能性があります。

以下はより複雑に見えますが、はるかに高速で信頼性が高くなります。

for %%A in (!i!) do echo !_c%%A!
于 2012-08-28T03:46:24.893 に答える
1

あなたの場合、変数に数字のみが含まれている場合、3番目の解決策が可能になる可能性があります。

@echo off
setlocal enabledelayedexpansion
(
  set i=10
  set _c!i!=4711

  set /a tmp=_c!i!
  echo !tmp!
)

これは機能し、SET /A明示的な展開文字を必要とせずに変数の内容にアクセスできます。

于 2012-08-28T07:45:00.473 に答える