windows - Batch Replace of !-sign -
i trying remove character ! in variable.
setlocal enableextensions enabledelayedexpansion set filename=!filename:!=_! i have tried escape ^ did not work.
set filename=!filename:^!=_! how can rid of !-sign in variable?
you cannot replace % when using normal expansion. must use delayed expansion insntead: !var:%%=_!
likewise, cannot replace ! when using delayed expansion. must use normal expansion instead: %var:!=_%.
but can problem if variable may contain mixture of poison characters ^, &, |, >, < quotes. example, there no single step way replace ! within following string: "this & that" & other thing!
the trick replacement in stages, using delayed expansion, 1 replacement using normal expansion.
1) delayed expansion - convert " ""
2) normal expansion - convert ! replacement. because quotes doubled, outer quotes around expansion guaranteed protect poison characters
3) delayed expansion - convert "" "
@echo off setlocal enabledelayedexpansion set "var="this ^& that" & other thing^!" echo before: !var! set "var=!var:"=""!" set "var=%var:!=_%" set "var=!var:""="!" echo after: !var! -- output --
before: "this & that" & other thing! after: "this & that" & other thing_ but dealing file names, can make problem simpler :-)
file names can contain poison characters & , ^, cannot contain quotes. can put quotes anywhere within file name (or path), , protect poison characters. quotes removed os when stores or looks files on disk.
so make sure file name , path variables not contain quotes. safe use:
set "filename=%filename:!=_%" oops - read question comments, , see within loop!
the fact substitution occurs within loop complicates things, since normal expansion not see values defined within loop.
note delayed expansion must off when variable expanded, otherwise corrupt ! within file name.
the simplest solution use call round of expansion:
@echo off setlocal disabledelayedexpansion %%f in (*) ( set "file=%%f" call set "file=%%file:!=_%%" setlocal enabledelayedexpansion echo file=!file! endlocal ) if doing other manipulations require delayed expansion, ! need escaped within normal expansion replacement expression because delayed expansion occurs before call. (thanks jeb).
here example eliminates ^ , & well.
@echo off setlocal disabledelayedexpansion %%f in (*) ( set "file=%%f" setlocal enabledelayedexpansion set "file=!file:^=_!" set "file=!file:&= , !" call set "file=%%file:^!=_%%" echo file=!file! endlocal ) although have enabled delayed expansion after have removed !. escape not needed.
Comments
Post a Comment