4

バッチ スクリプトでリテラル文字列を置換する方法を知っています。ただし、数値変数の値を置き換える必要がある特定の状況があります

これはスクリプトです:

setlocal enableextensions enabledelayedexpansion
set /A L=2
:L1
if %L% EQU 0 goto :EOF
set STRING="THIS IS # TEST"
SET NEW=%STRING:#=%%L%
echo %NEW%
set /A L=%L% - 1
goto L1

これを表示したい:

THIS IS 2 TEST
THIS IS 1 TEST

しかし、代わりにこれを表示することになります:

THIS IS  TEST2
THIS IS  TEST1

必要なことを実行するためのヒントはありますか?

ありがとう。

4

5 に答える 5

7

aphoria と Bali C のソリューションでも機能します。

set "NEW=!STRING:#=%L%!"

そのため、交換はパーセント拡張フェーズではなく、遅延拡張フェーズで行われます。

これは、感嘆符とキャレットでも機能しますSTRING

@echo off

set L=2
set "String=This is # test!"
setlocal EnableDelayedExpansion
set "NEW=!STRING:#=%L%!"
echo !NEW!
于 2013-01-07T15:21:02.653 に答える
3

あなたはもうすぐそこにいます、ただ変えてください

SET NEW=%STRING:#=%%L%

SET NEW=%STRING:#=!L!%
于 2013-01-07T14:52:45.923 に答える
2

楽しみのためだけに。遅延拡張なしでそれを行う方法は次のとおりです。:)

callコマンドを使用して、変数を二重展開します。%%秒を評価するには、変数の前後に2 つのパーセントを使用します。%最初に評価する変数の周りの単一パーセント。

setlocal EnableExtensions
set /A L=2

:L1
if %L% EQU 0 goto :EOF
set "STRING=THIS IS # TEST"
call set "NEW=%%STRING:#=%L%%%"
echo %NEW%
set /A L=%L% - 1
goto L1
于 2013-01-07T17:57:04.850 に答える
2

!L!遅延拡張を使用するには、 を使用する必要があります。

@ECHO OFF

SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
SET /A L=2
:L1
IF !L! EQU 0 goto :EOF
SET STRING=THIS IS # TEST
SET NEW=%STRING:#=!L!%
ECHO %NEW%
SET /A L=!L! - 1
GOTO L1

実際には、!L!どこでも使用する必要はなく、SET NEW=%STRING:#!L!%行内だけで使用できます。視覚的な一貫性を保つために、あらゆる場所で使用しました。

于 2013-01-07T14:53:05.957 に答える
2

STRING を「フォーマット文字列」として使用して、感嘆符で囲まれた適切な場所に目的の変数を配置することもできます。この方法では、値をさらに置き換える必要はなく、通常の方法でフォーマット文字列を表示するだけです。

rem Define the "format string" with Delayed Expansion disabled:
set STRING=THIS IS !L! TEST
setlocal enableextensions enabledelayedexpansion
set /A L=2
:L1
if %L% EQU 0 goto :EOF
   echo %STRING%
   set /A L=L - 1
goto L1

または、Delayed\Expansion なし:

set STRING=THIS IS %%L%% TEST
set /A L=2
:L1
if %L% EQU 0 goto :EOF
   call echo %STRING%
   set /A L=L - 1
goto L1

アントニオ

于 2013-01-07T18:30:52.170 に答える