2013-01-07 88 views
4

我知道如何在批處理腳本中進行字面字符串替換。但是,我有一個特定的情況下,我需要替換的數值變量批處理腳本(Windows)用扭曲字符串替換

這個值是腳本:

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 

關於如何讓它做我需要的任何提示?

謝謝。

回答

3

你幾乎沒有,只是改變

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

SET NEW=%STRING:#=!L!% 
+0

這並訣竅,謝謝! –

+0

不用擔心,很高興幫助:) –

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!%線。爲了視覺一致性,我在各地都使用它

+0

謝謝!現在工作。 –

7

即使aphoria和巴厘島的C解決方案將工作,最好使用

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

隨着然後更換將在延遲擴張階段完成,而不是在擴張階段百分比。

這也將與感嘆號和插入符在STRING

@echo off 

set L=2 
set "String=This is # test!" 
setlocal EnableDelayedExpansion 
set "NEW=!STRING:#=%L%!" 
echo !NEW! 
+1

內部人士對替換時機及其後果的很好解釋 –

2

工作只是爲了好玩。這是如何做到這一點,而不會延遲擴張。使用call命令來雙倍擴展變量。圍繞變量使用雙百分比%%來評估第二個。圍繞變量首先評估的單個百分比%

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 
2

您也可以使用字符串作爲「格式字符串」將所需的變量在封閉的感嘆號正確的地方。通過這種方式,不需要進一步的替代值的,只是在通常的方式顯示格式字符串:

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 

或者,沒有延遲\擴展:

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 

安東尼