windows - 包括来自 "for delims"的特殊字符 (&) - 批处理文件中的结果

标签 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 or external command,
operable program or batch file. 

因为它应该返回整行。 这就是部分,我还没有找到解决方案。它应该将“&”更改为“-”,就像最后这个脚本重命名文件一样。

最佳答案

首先,不要启用delayed expansion,因为这里不需要。如果使用不带或包含一个或多个感叹号的路径调用批处理文件,则可能会导致 findstr 找不到要打开的文件。

其次,FOR选项"tokens=*"会导致FINDSTR从不以开头的行输出中删除前导空格/制表符分号,如果还有剩余,则将该行的其余部分分配给指定的循环变量。如果这里需要这种行为,这是可以的。否则,最好使用 "delims=" ,它定义了一个空的分隔符列表,从而将不以分号开头的整行分配给指定的循环变量。非双引号参数字符串 delims^=^ eol^= 定义了一个空的分隔符列表,并且没有行结束符,以便为循环变量分配以分号开头的行。两个等号和空格字符必须使用脱字符号 ^ 进行转义,才能被解释为文字字符而不是参数分隔符。

第三,双引号参数字符串外的“&”被解释为运算符,在执行&之前的命令后无条件执行&之后的命令。有关详细信息,请参阅 Single line with multiple commands using Windows batch file 。因此,建议将命令 SET 的参数字符串括在双引号中,如 Why is no string output with 'echo %var%' after using 'set var = text' on command line? 上的答案中详细解释的那样

所以我建议使用以下代码:

@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

阅读 this answer 了解有关命令 SETLOCALENDLOCAL 的详细信息。

请注意,在FINDSTR命令行上使用/C:"title=而不是/C:title=,否则<在这种特殊情况下,strong>FINDSTR 将仅搜索 title。原因是圆括号内的命令行是在 FOR 启动的单独命令进程中执行的,cmd.exe/C 在后台,并且等号没有括在未使用 ^ 转义的双引号字符串将被当前命令进程删除,因为它被解释为分隔符。在命令提示符窗口中,可以使用 FINDSTR 命令行,其中 /C:title= 不带双引号,但在此 FOR 批处理文件中的命令行。

另请阅读有关 Using Command Redirection Operators 的 Microsoft 文章,了解 2>nul 的说明。重定向运算符 > 必须在 FOR 命令行上使用脱字符号 ^ 进行转义,以便在 Windows 命令解释器处理此命令行时将其解释为文字字符在执行命令 FOR 之前,该命令使用在后台启动的单独命令进程来执行嵌入式 findstr 命令行。

需要暂时启用延迟扩展,仅用于加载标题字符串的行的输出,因为在执行之前仅使用 echo %LoadedTitle% 会被修改为 echo title=variable & speed 并且&符号也不会被解释为 ECHO 输出的文字字符,而是在执行 echo title=variable < 后被解释为运行 speed 的运算符.

推荐阅读

批处理文件编写器必须始终考虑 Windows 命令处理器在解析命令行一次或多次后最终执行的内容,因为这可能与通过语法使用环境变量引用时在批处理文件中写入的内容不同%变量%

关于windows - 包括来自 "for delims"的特殊字符 (&) - 批处理文件中的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52541016/

相关文章:

android - adb 备份不起作用

windows - mongodb - 数据库未连接

c++ - 从 C++ 控制 Firefox

windows - 从 32 位 Windows 应用启动 64 位可执行文件

php - 通过 php 执行 powershell 命令

c# - 从 Windows 命令提示符运行本地 SQL 脚本文件以更新远程 SQL Server 数据库

c# - 从 IIS 运行 PsExec : PsExecSVC hanging on remote host

windows - 批处理脚本: Why does this condition evaluate to true?

IOS 应用程序运行时命令行失败

windows - Windows 上 gulp 的编码问题