1

印刷する行として機能する変数がありますが、行内の位置を介してその行の個々の文字を編集する必要があります。ただし、変数を使用して毎回場所を指定する必要があり、CMD は変数を間違った方法で解釈します。

    @echo off
    set fv=0
    set fh=1
    set /a fh1=%fh%+1
    set linev=line%fv%

    set line%fv%=%linev:~0,%fh%%%NEWCHARACTER%%linev:~%fh1%%

コードが乱雑で申し訳ありませんが、理解していただければ幸いです。CMD でコードを
%fv% %fh% %newcharacter% %fh1% として解釈し、2 つの文字列マニピュレータを部分文字列に変換します。

4

1 に答える 1

2

口頭での説明があっても、サンプル スクリプトの最後の行の評価の順序がよくわかりません。ただし、少なくとも、簡単な例を使用して、目的を達成する方法を示し、状況にその手法を適用する方法を理解できると思います。

%基本的に、ここでは即時 (または拡張) と遅延の 2 種類の拡張を使用する必要があります。

バッチファイルには適切な遅延展開があり、最初に有効にする必要があり (通常はコマンドをSETLOCAL EnableDelayedExpansion使用)、次に変数評価!の代わりに使用します。%次の例を検討してください。

SET ind=1
SET line%ind%=ABC
SETLOCAL EnableDelayedExpansion
ECHO !line%ind%!
ENDLOCAL

上記の例では、2 つの変数が作成されindますline1。2 番目の名前は、最初の変数を使用して部分的に作成されます。このような変数に値を設定する場合、割り当ての左側の部分である名前を評価する必要がないため、遅延展開は必要ありません。ただし、評価する必要がある場合は、遅延展開を使用する必要があります。上記のスクリプトのECHOコマンドは次のように機能します。

  • %ind%最初に評価されます。

  • 評価の結果%ind%、コマンドはECHO !line1!;になります。

  • 遅延展開が有効になったばかりなので、!特別な意味、つまり (遅延) 変数の評価を持ち、;と!line1!評価されます。ABC

  • ECHO印刷しABCます。

ほとんどの場合、この種の遅延展開が優先されますが、上記の例では、CALL-expansion を使用して同じことを実現することもできます。CALL-expansionを使用するように書き直した同じスクリプト例を次に示します。

SET ind=1
SET line%ind%=ABC
CALL ECHO %%line%ind%%%

基本的に%ずっと展開がありますが、評価される時期は部分ごとに異なります。2 番目の例の遅延評価がどのように機能するかを次に示します。

  • 最初は;%%に変わります。%

  • %ind%に評価され1ます。

  • 残りは;%%に変わります。%

  • CALL は実行するコマンドを受け取りECHO %line1%ます。

  • %line1%に評価されABCます。

  • ECHO印刷しABCます。

展開は遅く、CALL特にループで現れる可能性があります。一方、展開には、特にコマンドを使用して構文を有効にする!という事実から生じるいくつかの意味があります。別の質問に対する私の回答には、SETLOCALこのトピックに関する詳細があります。

于 2013-02-17T17:39:58.423 に答える