以下是输入文件的示例:
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没有正确设置?救命啊!
答案 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)