Batch file 如何正确获取字符“quot;”&引用;当延迟扩展处于活动状态时,是否转换为可变值?

Batch file 如何正确获取字符“quot;”&引用;当延迟扩展处于活动状态时,是否转换为可变值?,batch-file,Batch File,我制作了这个批处理脚本,将电子邮件和密码分别保存在两个单独的文件中,并从ComboBox.txt中保存它们。下面是一个示例: 分隔符可以是:,;“ 我的问题是密码中的感叹号“!”被SetLocal EnableDelayedExpansion忽略 所以我可以得到所有的特殊字符,除了一个“!” ComboBox.txt 我不知道你为什么要设置名为Email和Password的变量,而你可以直接使用元变量: Echo( 回音耐心地等待…提取电子邮件和短信,并在课程中通过。。。 如果不存在“%Inpu

我制作了这个批处理脚本,将电子邮件和密码分别保存在两个单独的文件中,并从ComboBox.txt中保存它们。下面是一个示例:

分隔符可以是:,;“

我的问题是密码中的感叹号“!”SetLocal EnableDelayedExpansion忽略

所以我可以得到所有的特殊字符,除了一个“!”

ComboBox.txt


我不知道你为什么要设置名为
Email
Password
的变量,而你可以直接使用元变量:

Echo(
回音耐心地等待…提取电子邮件和短信,并在课程中通过。。。
如果不存在“%InputFile%”退出/B
对于/F“UseBackQ令牌=1-2 Delims=:;”、““%InputFile%”中的%%A”如果不是“%%B=”,请执行(
>>“%OutPutFile\u Emails%”回显(%%A

不要在脚本中启用延迟扩展,此代码将替换您的行
10
-
20

我不确定您为什么要设置名为
Email
Password
的变量,而您可以直接使用元变量:

Echo(
回音耐心地等待…提取电子邮件和短信,并在课程中通过。。。
如果不存在“%InputFile%”退出/B
对于/F“UseBackQ令牌=1-2 Delims=:;”、““%InputFile%”中的%%A”如果不是“%%B=”,请执行(
>>“%OutPutFile\u Emails%”回显(%%A

不要在脚本中启用延迟扩展,此代码将替换您的行
10
-
20

代码中的问题是,您在的扩展过程中启用了延迟扩展,因为延迟扩展发生在最后,如下所述:,因此在早期阶段扩展的任何感叹号都将被使用通过延迟扩展。为了避免这种情况,请仅在需要时启用延迟扩展,并在其他情况下禁用它(因此,在扩展
元变量和元变量时):

对于/F“delims=:;,标记=1,*”%%a in('type”%InputFile%')do(
设置“电子邮件=%%a”
设置“密码=%%b”
setlocal EnableDelayedExpansion
>>“!OutPutFile\u Email!”如果已定义电子邮件回送(!Email!
>>“!OutPutFile\u Passwords!”如果已定义密码回显(!Password!)!
端部
)
由于实际上不需要分配任何环境变量,因此可以避免延迟扩展:

对于/F“delims=:;,标记=1,*”%%a in('type”%InputFile%')do(
>>“!OutPutFile_Emails!”如果不是“%%a”==”回显(%%a
>>“!OutPutFile_Passwords!”如果不是“%%b”==”回显(%%b
)

但还有另一个问题:密码甚至可能以分隔符
中的一个开头,因此不能将
用于/F“delims=,;:”
,因为它将多个相邻分隔符视为一个分隔符

以下代码安全地处理带有任意字符的密码(请参阅所有说明性的
rem
-备注):

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//在此处定义常量:
设置“\u infle=%~dp0ComboBox.txt”
设置“\u OUTFILE1=%~dp0Email\u Extracted.txt”
设置“\u OUTFILE2=%~dp0Passwords\u Extracted.txt”
rem//写入输出文件:
9> “%\u outpile1%”8>“%\u outpile2%”(
rem//在文本文件的行上循环(忽略空行):
对于/F usebackq^delims^=^eol^=%%L in(“%\u infle%”)do(
rem//将当前行存储在变量中:
设置“行=%%L”
rem//从第一个分隔符开始分割所有内容:
对于/F“delims=,;:”%%K in(“%%L”)do(
rem//将当前地址存储在变量中:
设置“地址=%%K”
rem//循环分隔符字符:
setlocal EnableDelayedExpansion
对于(“,”;“:”)中的%%S,请执行以下操作(
rem/*基于当前迭代的分隔符和
rem将其与原始行进行比较;这样,密码甚至可能
rem以分隔符开始;该条件仅满足一次:*/
如果“!ADDR!%%~S!行:%%~S=!”==“!行!”(
>&9回声(!地址!
>&8回音(!行:%%~S=!
)
)
端部
)
)
)
端部
退出/B
因此,使用此代码可以正确处理以下密码:

me@dummy.nil,;&"&":
me@dummy.nil;逗号。
me@dummy.nil::不包括^mark!?
me@dummy.nil:bla,bla“%

代码中的问题是,在的扩展期间启用了,因为延迟扩展与上次一样发生,如下所述:,因此,在早期阶段扩展的任何感叹号都会被延迟扩展占用。为避免这种情况,请仅在需要时启用延迟扩展,然后在其他阶段禁用延迟扩展(因此,在扩展
元变量的
过程中,也包括:

对于/F“delims=:;,标记=1,*”%%a in('type”%InputFile%')do(
设置“电子邮件=%%a”
设置“密码=%%b”
setlocal EnableDelayedExpansion
>>“!OutPutFile\u Email!”如果已定义电子邮件回送(!Email!
>>“!OutPutFile\u Passwords!”如果已定义密码回显(!Password!)!
端部
)
由于实际上不需要分配任何环境变量,因此可以避免延迟扩展:

对于/F“delims=:;,标记=1,*”%%a in('type”%InputFile%')do(
>>“!OutPutFile_Emails!”如果不是“%%a”==”回显(%%a
>>“!OutPutFile_Passwords!”如果不是“%%b”==”回显(%%b
)

但还有另一个问题:密码甚至可能以分隔符
中的一个开头,因此不能将
用于/F“delims=,;:”
,因为它将多个相邻分隔符视为一个分隔符

以下代码安全地处理带有任意字符的密码(请参阅所有说明性的
rem
-备注):

@echo关闭
setlocal Enabl
hackoo@hackoo.com,&azerty123><*
someone@gmail.com;He>llo123*!
andrew@yahoo.com:mommy!845
Cooker124@gmail.com:my!love1547
blue@hotmail:something!b010
hello@gmail.com:something!6655