如何用批處理文件中的其他內容替換字符串中的星號?批處理文件中的字符串替換(星號)?
如果From
是*
,%MyVar:From=To%
的正常擴展似乎不起作用。
即,如果我有:
Set MyVar=From
那麼這些不工作:
Echo %MyVar:*=To%
Echo %MyVar:^*=To%
什麼是做到這一點的正確方法是什麼?
如何用批處理文件中的其他內容替換字符串中的星號?批處理文件中的字符串替換(星號)?
如果From
是*
,%MyVar:From=To%
的正常擴展似乎不起作用。
即,如果我有:
Set MyVar=From
那麼這些不工作:
Echo %MyVar:*=To%
Echo %MyVar:^*=To%
什麼是做到這一點的正確方法是什麼?
像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
總有一個辦法(但難吃)
@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%
)
感謝您的回答!不幸的是,如果字符串中有引號,或者我做錯了什麼,似乎不起作用。有任何想法嗎? – Mehrdad
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
@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
+1,有趣的方法,但有點解釋會很好。順便說一句,它會去掉'old_str'的beginnig中的空格。在我的文章中,總是「10μA」和「100μs」,所以'fc'也會失效:-) – jeb
在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
呃,什麼是'edlin'? – Mehrdad
@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
另:
@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
你永遠不會停止也不會驚訝。非常好! –
謝謝,但是我在一個月前在一個更實驗性的論壇上提出了同樣的問題[如何在變量中替換「=」,「*」,「:」](http://www.dostips.com/forum /viewtopic.php?f=3&t=1485) – jeb
那麼,我能說什麼......我很高興你有一個很好的來源,可以幫助你驚喜像我這樣的人! :)我以前非常喜歡批處理腳本,但我缺乏持久性。而且,這些都是DOS時代,批量腳本功能在我看來非常差,所以我很快就冷卻了。爲了簡化它,我仍然喜歡並使用批處理腳本,因爲相對簡單的腳本可以節省相當多的時間。但是,你在答案和評論中展示的是不同程度的專業知識,我敢肯定,僅僅參加相關論壇是不夠的。 –