解析文本文件和修剪空间的问题 - 批处理文件

时间:2014-01-09 21:35:29

标签: parsing batch-file command-line

以下是输入文件的示例:

Changed the current scope context to 192.168.1.0 scope.

Type : N - NONE, D - DHCP B - BOOTP, U - UNSPECIFIED, R - RESERVATION IP
============================================================================================
IP Address      - Subnet Mask    - Unique ID           - Lease Expires        -Type -Name   
============================================================================================

192.168.1.1     - 255.255.255.0  - 00-50-60-02-d5-cf   -1/17/2014 2:20:58 PM   -D-  TBH-CBHS-Provider
192.168.1.7     - 255.255.255.0  - 00-50-60-82-09-e7   -1/14/2014 1:39:04 PM   -D-  Director-of-ASAP
192.168.1.8     - 255.255.255.0  - 00-50-60-82-0b-6d   -1/17/2014 2:20:44 PM   -D-  Soc-Work-Ser-FAP

这是应该解析它的文件(编辑:包含解析代码(也解释了一些看似冗余的变量):

@ECHO off
SETLOCAL EnableDelayedExpansion
SET scope=%1
FOR /F "skip=6 tokens=1,3,4,5,6,7,8,9 delims=-" %%B IN (%1.txt) DO (
set ipaddress=%%B
set ipaddress=%ipaddress: =%
set mac=%%C-%%D-%%E-%%F-%%G-%%H
set mac=%mac: =%
set lease=%%I
set lease=%lease: =%
echo %scope%,%ipaddress%,%mac%,%%I >> printer_scopes.txt)

最后,这是输出到printer_scopes.txt的内容:

192.168.1.0,Command completed successfully.,-----,1/17/2014 2:20:58 PM    
192.168.1.0,Command completed successfully.,-----,1/14/2014 1:39:04 PM    
192.168.1.0,Command completed successfully.,-----,1/17/2014 2:20:44 PM    

现在,我知道我目前没有修改空格的代码,但这是因为它所做的就是修剪字符串“Command completed successfully。”中的空格。这个字符串来自哪里?为什么mac没有正确设置?救命啊!

3 个答案:

答案 0 :(得分:2)

@ECHO OFF
SETLOCAL
DEL  printer_scopes.txt
SET scope=q21031672
FOR /F "skip=6 tokens=1,3,4,5,6,7,8,9delims=- " %%B IN (q21031672.txt) DO (
set ipaddress=%%B
set mac=%%C-%%D-%%E-%%F-%%G-%%H
echo %scope%,%%B,%%C-%%D-%%E-%%F-%%G-%%H,%%I >> printer_scopes.txt
)
GOTO :EOF

您的根本问题是delayed expansion

在块语句(a parenthesised series of statements)中,解析ENTIRE块并执行 THEN 。在块执行之前,块中的任何%var%将被该变量的值在块被分配的时间替换。

您看到的虚假值是在批次或部分启动时已经建立的值,可能来自之前的活动。出于这个原因,通常的做法是在setlocal之后调用@echo,这会在批处理结束时退出批处理对环境所做的任何更改。

下一个问题是你对delims短语的定位 - 如果你想要包含 Space ,它必须是最后一个,否则批次不知道它是否包括在delims中{1}}列表。最好永远放在最后。

FOR/F会忽略空行,因此您的skip可能需要调整。我只是将%1的值设置为常量q2103262,因为这适合我的测试。

不清楚是否需要变量;在这种情况下,输出可以直接从使用的肉变量生成,所以似乎没有意义,但我还是将它们留在那里。

答案 1 :(得分:2)

尝试这样:

@echo off&cls
SET scope=%1
setlocal EnableDelayedExpansion

for /f "skip=7 tokens=1,2,3,4,5,6,7,8,9 delims=- " %%a in (%1.txt) do (
                   set $IP=%%a
                   set $SUBNET_MASK=%%b 
                   set $MAC=%%c-%%d-%%e-%%f-%%g-%%h
                   echo %scope%,!$IP!,!$MAC!,%%i>> printer_scopes.t)

答案 2 :(得分:1)

未显示您的mac-address,因为()之间的整个块一次被解析,而%mac%在解析时为空。但你真的不需要%mac%(与%ipaddress%相同的问题 - 同样的解决方案):

@echo off
SET scope=%1
FOR /F "delims=- skip=8 tokens=1,3,4,5,6,7,8,9" %%B IN (%1.txt) DO (
echo %scope%,%%B,%%C-%%D-%%E-%%F-%%G-%%H,%%I >> printer_scopes.txt
)

(此代码中你没有使用%scope%

字符串"命令成功完成"我的窗户不会出现(Win7)