Windows 包括来自“的特殊字符”;对于熟食店-生成批处理文件
我有一个脚本,可以读取文件并在找到它时设置变量Windows 包括来自“的特殊字符”;对于熟食店-生成批处理文件,windows,batch-file,cmd,command-prompt,Windows,Batch File,Cmd,Command Prompt,我有一个脚本,可以读取文件并在找到它时设置变量 @echo off Setlocal EnableDelayedExpansion for /f "tokens=*" %%V in ('findstr /I /C:title= "%~1"') do set title=%%V echo %title% 在txt文件中有“title=variable&speed”。 脚本只返回: title=variable 'SPEED' is not recognized as an internal o
@echo off
Setlocal EnableDelayedExpansion
for /f "tokens=*" %%V in ('findstr /I /C:title= "%~1"') do set title=%%V
echo %title%
在txt文件中有“title=variable&speed”。
脚本只返回:
title=variable
'SPEED' is not recognized as an internal or external command,
operable program or batch file.
因为它应该返回整个线路。
这就是部分,我还没有找到解决方案。它应该将“&”改为“-”,就像这个脚本最后重命名文件一样。首先,不要启用,因为这里不需要。如果使用文件名调用批处理文件,但文件名不带或路径包含一个或多个感叹号,则会导致findstr
找不到要打开的文件
其次,FOR选项“tokens=*”
会从FINDSTR输出的行中删除前导空格/制表符,而不是以分号开头,如果还有剩余的内容,则将该行的其余部分分配给指定的循环变量。如果这里需要这种行为,这没关系。否则,最好使用“delims=“
”,它定义了一个空的分隔符列表,从而将整行不以分号开头分配给指定的循环变量。非双引号参数stringdelims^=^eol^=
定义了一个空的分隔符列表,并且没有行尾字符,可以为循环变量分配一个以分号开头的行。两个等号和空格字符必须用插入符号^
转义,以解释为文字字符,而不是参数分隔符
第三,双引号参数字符串外的与符号被解释为运算符,在执行&
之前的命令后,无条件地在&
之后执行命令。有关详细信息,请参阅。因此,建议将commandSET的参数字符串括在双引号中,如上的答案中所述
因此,我建议使用以下代码:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "LoadedTitle="
for /F "tokens=*" %%V in ('%SystemRoot%\System32\findstr.exe /I /C:"title=" "%~1" 2^>nul') do set "LoadedTitle=%%V"
if defined LoadedTitle (
setlocal EnableDelayedExpansion
echo !LoadedTitle!
endlocal
)
endlocal
有关命令SETLOCAL和ENDLOCAL的详细信息,请阅读
请注意,在FINDSTR命令行上使用/C:
代替/C:title=
,否则FINDSTR在这种特殊情况下只搜索title
。原因是圆括号内的命令行是在一个单独的命令进程中执行的,该命令进程由FOR在后台使用cmd.exe/C
启动,而未包含在双引号字符串中且未使用^
转义的等号将被当前命令进程删除,因为它被解释为分离器。在命令提示窗口中,可以将FINDSTR命令行与/C:title=
一起使用,而不使用双引号,但在批处理文件中的命令行上不能使用
另请阅读Microsoft关于的文章,了解2>nul
的解释。当Windows命令解释器处理此命令行时,重定向运算符
必须使用插入符号^
在上转义,以便在执行命令之前将命令行解释为文字字符,该命令执行嵌入的findstr
命令行单独的命令进程在后台启动
需要临时启用延迟扩展,仅用于加载标题字符串的行的输出,因为只有echo%LoadedTitle%
的使用会在执行之前修改为echo title=variable&speed
,并且,echo不会将与符号解释为输出的文字字符,但作为操作员,在执行echo title=variable
后运行speed
我建议你读书
%variable%
的环境变量引用在批处理文件中编写的操作。我找到了编写脚本的正确“公式”
@echo off
setlocal EnableExtensions EnableDelayedExpansion
for /F "tokens=*" %%V in ('%SystemRoot%\System32\findstr.exe /I /C:"title=" "%~1"
2^>nul') do set "title=%%V"
set title=!title:^&=-!
echo "!title!"
endlocal
正如我现在想要的那样,它返回:
"title=variable - SPEED"
这不是您建议的,但它可以完成任务。使用延迟扩展,您已经启用了它<代码>回声!标题代码>另一个好习惯是将set命令括在引号中<代码>设置“title=%%V”我看到您选择忽略我上面的评论。如果引用set语句,则不需要转义符号AND。