Windows batch/cmd 文件以提取网络驱动器(分隔符之间的字符串)?
Windows batch/cmd file to extract network drives (strings between delimiters)?
我已将网络驱动器备份到以下格式的 xml 文件。
<drive>
<drive letter>X</drive letter>
<drive path>\DANIEL-HP\Users\Public\Documents\Downloaded Data Sheets</drive path>
</drive>
<drive>
<drive letter>Y</drive letter>
<drive path>\DANIEL-HP\Users\Public</drive path>
</drive>
我想 运行 一个批处理或 cmd 文件从分隔符之间提取驱动器号和路径,然后映射它们。
为了简单起见,让我们忽略是否映射了其他驱动器。
盘符的分隔符是 <drive letter>
和 </drive letter>
。
驱动器路径的分隔符是 <drive path>
和 </drive path>
我不确定如何解析 /
<>
符号。
一个简单的 for
循环就很简单了:
for /f "tokens=3 delims=<>" %%a in ('find "<drive letter>" test.xml') do echo %%a
无需转义 >
和 <
,因为它们在引号内是安全的。
编辑
为字母和路径建立两个 "arrays" (1),然后加入它们以获得所需的结果:
@ECHO off
setlocal enabledelayedexpansion
REM get drives:
set c=0
for /f "tokens=3 delims=<>" %%a in ('find "<drive letter>" t.xml') do (
set /a c+=1
set drv-!c!=%%a
)
REM set paths:
set c=0
for /f "tokens=3 delims=<>" %%a in ('find "<drive path>" t.xml') do (
set /a c+=1
set pth-!c!=%%a
)
for /l %%x in (1,1,%c%) do echo !drv-%%x! !pth-%%x!
(1) 引用是因为
上的评论
简单使用 JREPL.BAT - a regular expression find/replace utility。它是纯脚本(混合 batch/JScript),可以在任何 Windows XP 以后的机器上本地运行,不需要任何第 3 方 exe 文件。
免责声明 - 理想情况下,您应该使用 xml 解析器来读取文件。但是假设文件始终具有您显示的 xml 布局,那么以下内容应该可以从命令行运行。
jrepl "<(drive letter)>(.*?)</>\s*<(drive path)>(.*?)</>" "+': = '+" /m /jmatch /f test.xml
如果我把你的样本 xml 放在 "test.xml"
中,这是输出
X: = \DANIEL-HP\Users\Public\Documents\Downloaded Data Sheets
Y: = \DANIEL-HP\Users\Public
我假设您希望这些值作为批处理脚本中的变量。您可以使用 FOR /F 循环来处理配对值:
@echo off
for /f "delims=| tokens=1*" %%A in (
'jrepl "<(drive letter)>(.*?)</>\s*<(drive path)>(.*?)</>" "+'|'+" /m /jmatch /f test.xml'
) do (
echo Drive letter = %%A
echo Drive path = %%B
echo(
)
输出:
Drive letter = X
Drive path = \DANIEL-HP\Users\Public\Documents\Downloaded Data Sheets
Drive letter = Y
Drive path = \DANIEL-HP\Users\Public
我已将网络驱动器备份到以下格式的 xml 文件。
<drive>
<drive letter>X</drive letter>
<drive path>\DANIEL-HP\Users\Public\Documents\Downloaded Data Sheets</drive path>
</drive>
<drive>
<drive letter>Y</drive letter>
<drive path>\DANIEL-HP\Users\Public</drive path>
</drive>
我想 运行 一个批处理或 cmd 文件从分隔符之间提取驱动器号和路径,然后映射它们。
为了简单起见,让我们忽略是否映射了其他驱动器。
盘符的分隔符是 <drive letter>
和 </drive letter>
。
驱动器路径的分隔符是 <drive path>
和 </drive path>
我不确定如何解析 /
<>
符号。
一个简单的 for
循环就很简单了:
for /f "tokens=3 delims=<>" %%a in ('find "<drive letter>" test.xml') do echo %%a
无需转义 >
和 <
,因为它们在引号内是安全的。
编辑
为字母和路径建立两个 "arrays" (1),然后加入它们以获得所需的结果:
@ECHO off
setlocal enabledelayedexpansion
REM get drives:
set c=0
for /f "tokens=3 delims=<>" %%a in ('find "<drive letter>" t.xml') do (
set /a c+=1
set drv-!c!=%%a
)
REM set paths:
set c=0
for /f "tokens=3 delims=<>" %%a in ('find "<drive path>" t.xml') do (
set /a c+=1
set pth-!c!=%%a
)
for /l %%x in (1,1,%c%) do echo !drv-%%x! !pth-%%x!
(1) 引用是因为
简单使用 JREPL.BAT - a regular expression find/replace utility。它是纯脚本(混合 batch/JScript),可以在任何 Windows XP 以后的机器上本地运行,不需要任何第 3 方 exe 文件。
免责声明 - 理想情况下,您应该使用 xml 解析器来读取文件。但是假设文件始终具有您显示的 xml 布局,那么以下内容应该可以从命令行运行。
jrepl "<(drive letter)>(.*?)</>\s*<(drive path)>(.*?)</>" "+': = '+" /m /jmatch /f test.xml
如果我把你的样本 xml 放在 "test.xml"
中,这是输出X: = \DANIEL-HP\Users\Public\Documents\Downloaded Data Sheets
Y: = \DANIEL-HP\Users\Public
我假设您希望这些值作为批处理脚本中的变量。您可以使用 FOR /F 循环来处理配对值:
@echo off
for /f "delims=| tokens=1*" %%A in (
'jrepl "<(drive letter)>(.*?)</>\s*<(drive path)>(.*?)</>" "+'|'+" /m /jmatch /f test.xml'
) do (
echo Drive letter = %%A
echo Drive path = %%B
echo(
)
输出:
Drive letter = X
Drive path = \DANIEL-HP\Users\Public\Documents\Downloaded Data Sheets
Drive letter = Y
Drive path = \DANIEL-HP\Users\Public