微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用批处理脚本从文本文件中获取唯一字符串

如何解决如何使用批处理脚本从文本文件中获取唯一字符串

我有一个包含以下信息的文本文件

-host A -P 1
-host A -P 2

-host B -P 1
-host B -P 2
-host B -P 3

-host C -P 1
-host C -P 2

-host A -P 3

现在从批处理脚本中,我想唯一地提取这些主机名。例如,获取我的数组后应如下所示:[A B C]

我可以使用以下命令获取这些主机名:

setlocal ENABLEDELAYEDEXPANSION
set /A f=0
if exist "%TEXTFILE%" for /F usebackq^ delims^=^ eol^= %%I in (%TEXTFILE%) do for %%J in (%%I) do (
    if /I "%%~J" == "-host" (
        set /A f=1
    ) else (
        if !f!==1 (
            echo %%J
            set /A f=0
        ) 
    )
)

我得到以下输出

A
A
B
B
B
C
C
A

但我只想要唯一的名字。 我们应该如何从文本文件获取唯一名称

解决方法

@echo off
setlocal
for /f "tokens=2" %%a in (test.txt) do set "_%%a=."
for /f "delims=_=" %%a in ('set _') do echo %%a

输出:

A
B
C

第一个 for 为每个名称设置一个变量(我们不关心内容)。 第二个 for 列出了这些变量。为此,所有变量都必须以相同的字符开头,并且没有其他变量可以以该字母开头。 set 命令甚至会为您按字母顺序对它们进行排序。

@echo off
setlocal enabledelayedexpansion
set "list=["
for /f "tokens=2" %%a in (test.txt) do set "_%%a=."
for /f "delims=_=" %%a in ('set _') do set "list=!list! %%a"
set "list=%list:[ =[%]"
echo %list%

输出:

[A B C]
,

接下来是一个外观相当复杂的批处理文件,只为在 Windows 10 上使用而编写。代码仅在该操作系统版本中使用 /unique 命令的新的但未记录在案的 sort 选项。 我应该在这里提到,sort 命令不区分大小写,因此,例如,aA 不是唯一的。

它尝试获取前导 -host 单词和任何后续 -P* 单词之间的所有修剪内容。我这样做是为了确保仍会捕获包含空格的字符串。主机名中不允许使用空格,因此您不需要此额外功能,但是,对于一般用途,它可能对您有用。此外,如果您希望稍后对其进行修改以用于其他用途,它当前不会捕获以连字符开头的子字符串,这在主机名中也是不允许的,(您需要修改 findstr 子匹配行[^-] 上的8 以允许此类字符串。 最后,如果不区分大小写的行前导词不是-host,您可以在行{{1} 上更改它},如果您的第二个连字符前导词不是以不区分大小写的字符对 8 开头,您可以在第 -P 行修改它。

预期的输出应该是一个变量 11,使用您发布的示例,它应该如下所示:

%array%

如果您不想使用逗号,请将第 "A","B","C" 行上的 ^, 更改为 37。此外,如果您不需要封闭的双引号,请将第 行上的 "%%I" 更改为 35,并将第 %%I 行上的 "!$:~1!" 更改为 37 .

它还应该为每个数组索引项创建单独的变量,格式为 !$:~1!其中 %array[#]% 是索引号,从零开始,(您可以通过更改 { {1}} 行#Set "$=-1"17Set "$=0"array[0])。 使用您发布的示例,当前代码应该产生以下内容:

28

这是批处理文件示例,请记住将 array[1] 的值调整为完整的、(推荐的) 或相对于第 {{1 }}:

%array[0]% - expanding to string value A
%array[1]% - expanding to string value B
%array[2]% - expanding to string value C

包含最后一行只是为了确保您可以看到结果变量及其值。测试后,您可以根据需要将其替换为您自己的代码。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。