接下来是一个看起来相当复杂的批处理文件,仅为在 Windows 10 上使用而编写。代码仅在该操作系统版本中使用sort 命令的新的但未记录的/unique 选项。 我应该在这里提到sort 命令不区分大小写,因此a 和A 不是唯一的。
它会尝试获取前导 -host 单词和任何后续 -P* 单词之间的所有修剪内容。我这样做是为了确保仍会捕获包含空格的字符串。主机名中不允许使用空格,因此您不需要这个额外的功能,但是,对于一般用途,它可能对您有用。此外,如果您希望稍后修改它以供其他用途,它目前不会捕获以连字符开头的子字符串,这在主机名中也是不允许的,(您需要修改 findstr 子匹配 @987654329 @ 在线 8 以允许此类字符串)。 最后,如果您不区分大小写的行前导词不是 -host,您可以在行 8 上更改它,如果您的第二个连字符前导词没有'不要以不区分大小写的字符对-P开头,您可以在11行上修改它。
预期的输出应该是一个变量%array%,使用您发布的示例,它应该如下所示:
"A","B","C"
如果您不想使用逗号,请将37 线上的^, 更改为 。此外,如果您不需要封闭的双引号,请将35 上的"%%I" 更改为%%I,将37 上的"!$:~1!" 更改为!$:~1!。
它还应该为每个数组索引项创建单独的变量,格式为%array[#]%,其中#是索引号,从零开始,(您可以通过在线更改Set "$=-1"来调整它17 到 Set "$=0" 和 array[0] 在线 28 到 array[1])。 使用您发布的示例,当前代码应生成以下内容:
%array[0]% - expanding to string value A
%array[1]% - expanding to string value B
%array[2]% - expanding to string value C
这里是批处理文件示例,请记住将%TEXTFILE% 的值调整为3 行上源文件的完整路径(推荐) 或相对路径:
@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "TEXTFILE=myfile.txt"
Set "$T=%TEMP%\$.lst"
If Not Exist "%TEXTFILE%" GoTo :EOF
For /F "Delims==" %%G In ('"(Set array) 2>NUL"') Do Set "%%G="
( For /F Delims^=^ EOL^= %%G In ('Type "%TEXTFILE%" ^|
%SystemRoot%\System32\findstr.exe /RIC:"^-host[ ][ ]*[^-]"') Do (
Set "$=%%G"
SetLocal EnableDelayedExpansion
For /F "Delims=&" %%H In ("!$: -P=&:!") Do (
EndLocal
For /F "Tokens=1,*" %%I In ("%%H") Do Echo %%J
)
)
) 1>"%$T%"
Set "$=-1"
For /F Delims^=^ EOL^= %%G In (
'%SystemRoot%\System32\sort.exe /Unique "%$T%" ^& Del "%$T%"'
) Do (
Set /A $ += 1
SetLocal EnableDelayedExpansion
For %%H In (!$!) Do (
EndLocal
Set "array[%%H]=%%G"
)
)
If Not Defined array[0] GoTo :EOF
For /F "Tokens=1,* Delims=]" %%G In ('"(Set array[) 2>NUL"') Do (
Set "$=%%H"
SetLocal EnableDelayedExpansion
If Not Defined array (
For /F Delims^=^ EOL^= %%I In ("!$:~1!") Do (
EndLocal
Set "array="%%I""
)
) Else For /F UseBackQ^ Delims^=^ EOL^= %%I In ('!array!^,"!$:~1!"') Do (
EndLocal
Set "array=%%I"
)
)
For %%G In (TEXTFILE $T $) Do Set "%%G="
Set array & Pause
最后一行只是为了确保您可以看到结果变量及其值。测试后,您可以根据需要将其替换为您自己的代码。