Parsing 解析文本文件和修剪空间时出现问题-批处理文件

Parsing 解析文本文件和修剪空间时出现问题-批处理文件,parsing,batch-file,command-line,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

以下是输入文件的示例:

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
下面是应该解析它的文件(编辑:包含解析代码(这也解释了一些看似冗余的变量):

最后,这里是输出到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设置不正确?帮助!

@ECHO OFF
SETLOCAL
DEL printer_scopes.txt
设置范围=q21031672
对于(q21031672.txt)中的/F“跳过=6标记=1,3,4,5,6,7,8,9delims=-”%%B(
设置ipaddress=%%B
设置mac=%%C-%%D-%%E-%%F-%%G-%%H
回显%scope%、%%B、%%C-%%D-%%E-%%F-%%G-%%H、%%I>>打印机\u scopes.txt
)
后藤:EOF
您的根本问题是扩展延迟

在块语句
(括号内的一系列语句)
,整个块被解析,然后执行。在执行块之前,块中的任何
%var%
都将在解析块时被该变量的值替换

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

下一个问题是您对
delims
短语的定位-如果您希望包含空格,它必须是最后一个,否则batch不知道它是否包含在
delims
列表中。最好始终放在最后

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


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

您的mac地址没有显示,因为
之间的整个块)
立即被解析,解析时
%mac%
为空。但您实际上不需要
%mac%
(与
%ipaddress%
相同的问题-相同的解决方案):

(此外,您在此代码中未使用
%scope%

字符串“command completed successfully”(命令成功完成)在我的windows(Win7)中不出现

@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)

你能发布你的修剪代码和预期输出吗?你发布的代码在Windows 7 Pro x64中运行时,输出:
test,192.168.1.8,00-50-60-82-0b-6d,2014年1月14日1:39:04 PM test,192.168.1.8,00-50-60-82-0b-6d,2014年1月17日2:20:44 PM
(准确地说是
%scope%,%ipaddress%,%mac%,%I
)。有效(接近)对我来说很好(WIN7)。您不需要
ipaddress
-变量。只需
echo%scope%,%%B,%mac%…
(如果必须使用该变量,请使用延迟扩展和
!ipaddress!
…与
mac
-变量相同。您并不真正需要它。如果使用该变量,请使用延迟扩展和
!mac!
,如果您在输出中显示您期望的内容,则它将有助于解决任何问题。EnableDelayedExpansion的组合-我已经看到过)其他地方-还有!var!语法-我没有-起到了作用。谢谢!我希望我能给你部分的信任-你的解释很清楚,解释了一些我不清楚的概念。不幸的是,enabledayedexpansion和!var!才是真正起到作用的。不过,我非常感谢你的回答。
@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
)
@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)