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
我正在 运行 对从我的作品网页复制到文本文件的文本进行循环。我发现从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