2011-08-11 118 views
4

如何用批處理文件中的其他內容替換字符串中的星號批處理文件中的字符串替換(星號)?

如果From*%MyVar:From=To%的正常擴展似乎不起作用。

即,如果我有:

Set MyVar=From 

那麼這些不工作:

Echo %MyVar:*=To% 
Echo %MyVar:^*=To% 

什麼是做到這一點的正確方法是什麼?

回答

7

像Sorpigal的一個解決方案,但它處理文字與星和聚星更換開始,它不會失敗的報價。

@echo off 
setlocal EnableDelayedExpansion 
rem replace all "*" with "." 
set "replace=." 
set "var=*One**two***three" 

rem Add dummy char to accept also a star in front 
set "var=#!var!" 
:replaceLoop 
for /F "tokens=1 delims=*" %%A in ("!var!") do (
    set "prefix=%%A" 
    set "rest=!var:*%%A=!" 
    if defined rest (
    set "rest=!REPLACE!!rest:~1!" 
    set Again=1 
) else set "Again=" 
    set "var=%%A!rest!" 
) 
if defined again goto :replaceLoop 
set "var=!var:~1!" 
echo !var! 
exit /b 
+0

你永遠不會停止也不會驚訝。非常好! –

+0

謝謝,但是我在一個月前在一個更實驗性的論壇上提出了同樣的問題[如何在變量中替換「=」,「*」,「:」](http://www.dostips.com/forum /viewtopic.php?f=3&t=1485) – jeb

+0

那麼,我能說什麼......我很高興你有一個很好的來源,可以幫助你驚喜像我這樣的人! :)我以前非常喜歡批處理腳本,但我缺乏持久性。而且,這些都是DOS時代,批量腳本功能在我看來非常差,所以我很快就冷卻了。爲了簡化它,我仍然喜歡並使用批處理腳本,因爲相對簡單的腳本可以節省相當多的時間。但是,你在答案和評論中展示的是不同程度的專業知識,我敢肯定,僅僅參加相關論壇是不夠的。 –

2

總有一個辦法(但難吃)

@echo off 
set myvar=one two * four 
set replacement=three 

for /f "tokens=1,2 delims=*" %%a in ("%myvar%") do (
    set tmp1=%%a 
    set tmp2=%%b 

    echo %tmp1%%replacement%%tmp2% 
) 
+0

感謝您的回答!不幸的是,如果字符串中有引號,或者我做錯了什麼,似乎不起作用。有任何想法嗎? – Mehrdad

0

PS +批處理

@echo off 

set string=*hello***lop* 
set oldchar=* 
set newchar=$ 

for /f "tokens=*" %%* in (' 
    "powershell -c ""$env:string"".replace('%oldchar%','%newchar%')" 
') do set result=%%* 

echo %result% 
pause 
goto :eof 
1
@echo off 
setlocal EnableDelayedExpansion 

set old_str=**hello * world ** 
set oldchar=* 
set newchar=$ 
set new_str= 

>$1 (<nul,set/P=%old_str%) 
For %%a in ($1) do set /A cnt=%%~za 
>$2 (For /l %%a in (1 1 %cnt%) do <nul,set/P=µ) 

For /f "tokens=3" %%a in ('"fc /b $2 $1|findstr :"') do (
    set /A dec=0x%%a 
    %ComsPec% /c exit /b !dec! 
    if "!=ExitCodeAscii!"=="%oldchar%" (
     set new_str=!new_str!%newchar% 
    ) else (
     set new_str=!new_str!!=ExitCodeAscii! 
    ) 
) 
del $? 
echo %old_str% 
echo %new_str% 
pause 
+0

+1,有趣的方法,但有點解釋會很好。順便說一句,它會去掉'old_str'的​​beginnig中的空格。在我的文章中,總是「10μA」和「100μs」,所以'fc'也會失效:-) – jeb

1

在Windows XP上測試的變體:

@echo off 1>nul 2>nul 3>nul 4>nul 

set string=**hello*World** 
set old_char=* 
set new_char=# 

pushd %Temp%.\ 

set string>f1.t 

copy nul+nul f0.t 

for /f %%a in (f0.t) do (
    (
    echo 1r%old_char%%%a%new_char% 
    echo w 
    echo e 
) | edlin /b f1.t 
) 
for /f "tokens=*" %%i in (f1.t) do set %%i 

echo %string% >con 

del f0.t f1.t f1.bak 

popd 
pause 
+0

呃,什麼是'edlin'? – Mehrdad

1

@Mehrdad:EDLIN可在XP:

hh.exe ntcmds.chm::/edlin.htm 
hh.exe ntcmds.chm::/edlin_subcmds.htm 

另一種變體:

@echo off 
setlocal EnableDelayedExpansion 

set string=**hello * World** 
set old_char=* 
set new_char=# 
set new_str= 

for /l %%a in (0 1 0xFF) do (
    if !string:~%%a^,1!. neq %old_char%. (
    set "new_str=!new_str!!string:~%%a,1!" 
) else if !string:~%%a^,1!. neq . (
    Set new_str=!new_str!%new_char%)) 

echo !new_str! 
pause 
1

另:

@echo off 

set str=**hello ** world** 
set old=\* 
set new=# 

for /f "useback delims=" %%_ in (`@mshta "about:<script>var string='%str%';new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(string.replace(/%Old%/g,'%New%'));close();</script>" ^|more`) do set res=%%_ 

echo %str% 
echo %res% 

pause 
相關問題