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=“
”,它定义了一个空的分隔符列表,从而将整行不以分号开头分配给指定的循环变量。非双引号参数string
delims^=^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
有关命令SETLOCALENDLOCAL的详细信息,请阅读

请注意,在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

我建议你读书

批处理文件编写器必须始终考虑Windows command processor在对命令行进行一次或多次解析后最终执行的操作,因为这可能不同于使用语法为
%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。