delims 空格和制表符与网页副本不同

delims spaces and tabs differ from webpage copy

我正在 运行 对从我的作品网页复制到文本文件的文本进行循环。我发现从GoogleChrome复制过来,文本内容有"delims"个"TAB"。如果我从 Internet Explorer 复制相同的信息,则 Delims 为 "SPACES",与 Firefox 相同。然后这会改变令牌的数量等,并且每种类型需要两组不同的代码。

所以...(示例)

Chrome

文本复制格式

2 Dec 2016 12:37 GMT    194.176.105.169 United Kingdom  ID007638.CENTRAL    3.10.6.0    Remove
2 Dec 2016 12:36 GMT    194.176.105.152 United Kingdom  ID007578.CENTRAL    3.10.6.0    Remove
2 Dec 2016 12:34 GMT    194.176.105.166 United Kingdom  ID006715.CENTRAL    3.10.6.0    Remove

for /F "usebackq tokens=5 delims=   " %%J in ("hosts.txt") do @echo(%%J

Internet Explorer

文本复制格式

2 Dec 2016 10:16 GMT 194.176.105.132 United Kingdom  ID007643.CENTRAL 3.10.6.0 Remove 
2 Dec 2016 10:16 GMT 194.176.105.133 United Kingdom  ID006967.CENTRAL 3.10.6.0 Remove 
1 Dec 2016 17:59 GMT 194.176.105.139 United Kingdom  ID006972.CENTRAL 3.10.6.0 Remove 
1 Dec 2016 17:55 GMT 194.176.105.132 United Kingdom  ID007574.CENTRAL 3.10.6.0 Remove 

for /F "usebackq tokens=10 delims= " %%J in ("hosts.txt") do @echo(%%J

所以我可以让用户选择你是从 chrome 还是 IE、Forefox 复制然后执行代码 xyz,但我宁愿代码查看文本文件并以某种方式看到它正在使用空格as delims 然后 运行 空格和 delims 的代码,或者如果它找到制表符 delims 然后 运行 那个代码。这是我为同事们做的一个小项目,他们需要做的越少越好。这可能吗?也许 运行 空格上的查找命令(?)然后执行 X 或找到 TABS 的存在然后执行 y。

我认为这个方法可以解决你的问题:

@echo off
setlocal EnableDelayedExpansion

for /F "usebackq delims=" %%a in ("hosts.txt") do (
   for %%b in (%%a) do (
      set "hostname=!version!"
      set "version=!last!"
      set "last=%%b"
   )
   echo Hostname: !hostname!,  version: !version!
)

此方法采用空格或 TAB 分隔的行的最后一个和 "last-but-two"(是否正确书写?)字段。

编辑新解决方案作为对评论的回复

@echo off
setlocal EnableDelayedExpansion

rem Define the fields
set "field[1]=Version"
set "field[2]=Hostname"
set "field[4]=IPaddress"

rem Show the options
:start
cls
set "choice="
for /L %%i in (1,1,7) do (
   set "option=%%i. Extract"
   for %%j in (1,2,4) do (
      set /A "j=%%i&%%j"
      if !j! neq 0 set "option=!option! !field[%%j]! and"
   )
   echo !option:~0,-4!
   set "choice=!choice!%%i"
)
echo X. Exit
echo/

rem Get the option and assemble the output format
choice /C %choice%X /N /M "Select option: "
set "choice=%errorlevel%"
if %choice% gtr 7 goto :EOF
set "output="
set "file="
for %%j in (1,2,4) do (
   set /A "j=choice&%%j"
   if !j! neq 0 (
      set "output=!output!^!!field[%%j]!^!  "
      set "file=!file!!field[%%j]! "
   )
)

rem Read input file and generate output file
(for /F "usebackq tokens=6*" %%a in ("hosts.txt") do (
   set "IPaddress=%%a"
   for %%c in (%%b) do (
      for %%d in ("!version!") do set "hostname=%%~Nd"
      set "version=!last!"
      set "last=%%c"
   )
   echo %output%
)) > "%file:~0,-1%.txt"
start "" "%file:~0,-1%.txt"
goto start

此代码以任何格式(用 space 或制表符复制)都可以工作,它会创建一个 spaced 分隔文本文件,其中包含所有提取的信息,然后进一步询问..

从任何浏览器复制并粘贴到 hosts.txt,然后将内容输出到另一个文本文件....(hosts2.txt)

for /F "usebackq delims=" %%a in ("hosts.txt") do (
   for %%b in (%%a) do (
      set "hostname=!version!"
      set "version=!last!"
      set "last=%%b"
    )
    echo !hostname! !version!>>"hosts2.txt"
)

然后我使用下面的代码显示 "just the hostname in a txt file"、"just the version number in a txt file" 或两者 "version and hostname in a txt file"

:start
CLS
echo.
echo                    :::::::::::::::::::::::::::::::::::::::::::::::::
echo                    ::        1. Extract Hostnames                 ::
Echo                    ::        2. Extract Version                   ::
echo                    ::        3. Extract Hostnames and Version     ::
echo                    :::::::::::::::::::::::::::::::::::::::::::::::::
echo.
SET /P "Input= "
if '%Input%'=='1' (goto run1)
if '%Input%'=='2' (goto run2)
if '%Input%'=='3' (goto run3)

:run1
> "hostnames.txt" (
        for /F "usebackq tokens=1 delims=." %%J in ("hosts2.txt") do @echo(%%J
)
start "" "hostnames.txt"
goto start

:run2
> "version.txt" (
    for /F "usebackq tokens=2 delims= " %%J in ("hosts2.txt") do @echo(%%J
)
start "" "version.txt"
goto start


:run3
> "hostnver.txt" (
    for /F "usebackq tokens=1,2 delims= " %%J in ("hosts2.txt") do @(
        for /F "tokens=1 delims=." %%I in ("%%J") do @echo(%%I %%K
    )
)
start "" "hostnver.txt"
goto start