我工作的一个批处理文件,获得的数据作为一个变量,该变量它有一个感叹号。
我所试图做的是添加必要的转义字符的变量。
"Title":"Turk 182!"
以上是我处理的数据的一个例子。
setlocal EnableDelayedExpansion
rem replace ! with ^^!
set var=%var:!=^^!!%
但我不知道这是正确的语法,因为我怎能逃脱的esclamation标记,如果它也被用来作为搜索的一部分,并取代?
我想用一个转义版本替换所有esclamation的印记,以便它可以显示和使用工作。
顺便说一句,有没有批任何现有的功能,将删除,并允许所有特殊字符转义?
下面是更多的代码可能有助于解释我在做什么。
{"Title":"Turk 182!","Year":"1985","Rated":"PG-13","Released":"15 Feb 1985","Runtime":"1 h 42 min","Genre":"Action, Comedy, Drama","Director":"Bob Clark","Writer":"Denis Hamill, James Gregory Kingston","Actors":"Timothy Hutton, Robert Urich, Kim Cattrall, Robert Culp","Plot":"Jimmy Lynch is angry because his older brother, who was injured as a result of an off duty fire rescue...","Poster":"http://ia.media-imdb.com/images/M/MV5BMTQ2OTk1ODA1MV5BMl5BanBnXkFtZTcwNjYwNjgyMQ@@._V1_SX300.jpg","imdbRating":"5.7","imdbVotes":"2,360","imdbID":"tt0090217","Response":"True"}
rem removes starting and ending brackets
set json=%json:~1,-1%
setlocal EnableDelayedExpansion
rem replace "," with linebreak
set json=!json:","="#"!
setlocal EnableDelayedExpansion
rem replace ! with ^^!
set json=%json:!=^^!!%
setlocal DisableDelayedExpansion
echo %json%
echo.
exit /b
然后我把json的变量在循环,它错误的出,而不是真正的价值我只看到实际的替换命令我上面使用。
Answer 1:
我不相信你真的需要逃跑!
。 这是可以做到的,但杰布试图解释,它可以变得复杂。
根据您提供的代码,它看起来像你对我有什么不明白的延迟扩展一样。 我建议你键入HELP SET
从命令提示符和阅读文档。 延迟扩展的描述开始约一半下来,上面写着“最后,对于延迟的环境变量扩展支持......”行
有延迟扩展等主要优点。 其中一个最大的优点是你永远不用担心当您使用延迟扩展转义任何特殊字符。 而使用正常的扩张转义字符是一个痛苦,直到你获得的经验非常令人迷惑。 (这真的是合乎逻辑的和可预见的,但直到你了解它,它看起来像废话)
与延迟扩展的最大问题是FOR循环时,数据中包含它没有发挥好!
。 这是因为FOR变量被膨胀后发生延迟的扩张,使含有值!
将被破坏。 在下面我JSON解析器,我切换延迟扩展关内循环,以避免这样的问题。
我不知道很多关于JSON,所以我下面的解决方案可能是幼稚的(不完整)。 但这里是一个简单的JSON解析器,根据您提供的数据工作。 我把你的JSON字符串在一个名为“test.txt的”文件
@echo off
setlocal disableDelayedExpansion
setlocal enableDelayedExpansion
::Read the json string from a file
<test.txt set /p "json="
::Define LF variable to contain a linefeed
set LF=^
::The above 2 blank lines are critical - DO NOT REMOVE
::Strip the enclosing braces
set "json=!json:~1,-1!"
::Substitute a linefeed for ","
for %%A in ("!LF!") do set "json=!json:","=%%~A!"
::Substitute = for ":"
set "json=!json:":"==!"
::Remove remaining "
set "json=!json:"=!"
::Loop through the data, creating variables of the form var_name=value
for /f "delims=" %%A in ("!json!") do (
REM If delayed expansion is enabled then endlocal to get back to disabled state
if "!!" equ "" endlocal
REM Create the variable
set "var_%%A"
)
::Display the results - list all variables that begin with var_
set var_
这里是输出
var_Actors=Timothy Hutton, Robert Urich, Kim Cattrall, Robert Culp
var_Director=Bob Clark
var_Genre=Action, Comedy, Drama
var_imdbID=tt0090217
var_imdbRating=5.7
var_imdbVotes=2,360
var_Plot=Jimmy Lynch is angry because his older brother, who was injured as a result of an off duty fire rescue...
var_Poster=http://ia.media-imdb.com/images/M/MV5BMTQ2OTk1ODA1MV5BMl5BanBnXkFtZTcwNjYwNjgyMQ@@._V1_SX300.jpg
var_Rated=PG-13
var_Released=15 Feb 1985
var_Response=True
var_Runtime=1 h 42 min
var_Title=Turk 182!
var_Writer=Denis Hamill, James Gregory Kingston
var_Year=1985
Answer 2:
如果你启用延迟扩展,则不应使用与特殊字符的扩展个百分点。
如果您使用的是延迟膨胀,而不是你没有得到与感叹号或其他字符的问题。
set myTitle="Turk 182!"
setlocal EnableDelayedExpansion
echo Title=!myTitle!
你可以替换惊叹号,但你需要复式脱字和计数取决于许多因素。
- 是引号内感叹号?
- 你直接回应,或你想从一个变量复制到另一个和它呼应呢?
- 如何将其与另一个值进行比较。
由于小样本,为什么百分之扩张并非最好的选择
@echo off
set test1=An exclamation mark^^^^!
setlocal EnableDelayedExpansion
set test2=An exclamation mark^^^^^^^^^^!
set "test3=An exclamation mark^^^^^!"
set test4a=An exclamation mark^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
set test4b=%test4a%!
echo %test1%
echo %test2%
echo %test3%
echo %test4b%
如果你想在一个安全的方式从文件中读取文本,你可以使用延迟反复TECHNIC。
setlocal DisableDelayedExpansion
for /F "delims=" %%a in (myFile.txt) DO (
set "line=%%a"
setlocal EnableDelayedExpansion
echo !line!
endlocal
)
Answer 3:
您可以使用PowerShell:
$json=@"
{"Title":"Turk 182!","Year":"1985","Rated":"PG-13","Released":"15 Feb 1985","Runtime":"1 h 42 min","Genre":"Action, Comedy, Drama","Director":"Bob Clark","Writer":"Denis Hamill, James Gregory Kingston","Actors":"Timothy Hutton, Robert Urich, Kim Cattrall, Robert Culp","Plot":"Jimmy Lynch is angry because his older brother, who was injured as a result of an off duty fire rescue...","Poster":"http://ia.media-imdb.com/images/M/MV5BMTQ2OTk1ODA1MV5BMl5BanBnXkFtZTcwNjYwNjgyMQ@@._V1_SX300.jpg","imdbRating":"5.7","imdbVotes":"2,360","imdbID":"tt0090217","Response":"True"}
"@
add-type -assembly system.web.extensions
$jserial = new-Object Web.Script.Serialization.JavaScriptSerializer
$jserial.DeserializeObject($json)
Key Value
--- -----
Title Turk 182!
Year 1985
Rated PG-13
Released 15 Feb 1985
Runtime 1 h 42 min
Genre Action, Comedy, Drama
Director Bob Clark
Writer Denis Hamill, James Gregory Kingston
Actors Timothy Hutton, Robert Urich, Kim Cattrall, Robert Culp
Plot Jimmy Lynch is angry because his older brother, who was ..
Poster http://ia.media-imdb.com/images/M/MV5BMTQ2OTk1ODA1MV5BMl..
imdbRating 5.7
imdbVotes 2,360
imdbID tt0090217
Response True
或使用PowerShell v3的:
PS III> $json | ConvertFrom-JSON
Key Value
--- -----
Title Turk 182!
Year 1985
Rated PG-13
Released 15 Feb 1985
Runtime 1 h 42 min
Genre Action, Comedy, Drama
Director Bob Clark
Writer Denis Hamill, James Gregory Kingston
Actors Timothy Hutton, Robert Urich, Kim Cattrall, Robert Culp
Plot Jimmy Lynch is angry because his older brother, who was ..
Poster http://ia.media-imdb.com/images/M/MV5BMTQ2OTk1ODA1MV5BMl..
imdbRating 5.7
imdbVotes 2,360
imdbID tt0090217
Response
Answer 4:
杰布和dbenham已经完全回答了这个问题,所以这是有点题外话...
我用一个小窍门,以避免麻烦,还记得我必须有多少插入记号,以便在不同情况下使用感叹号插入。 我定义禁用延迟扩展变量并分配给它一个感叹号(I称之为砰 )。 然后我启用延迟扩展,并把它作为!砰! 这样,该值将始终显示为一个感叹号,这是很容易写...
@echo off
setlocal DisableDelayedExpansion
set bang=!
setlocal EnableDelayedExpansion
echo Yes, it works!bang!
安东尼奥
文章来源: Batch File Replace Exclamation Mark with Escaped Exclamation Mark