2016-07-30 8 views
0

Я скопировал сетевой диск в xml-файл в следующем формате.Windows-пакет/cmd-файл для извлечения сетевых дисков (строки между разделителями)?

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

Я не уверен, о том, как разобрать /<> символов.

+0

Я имел в виду, чтобы отправить это на суперпользователя, это нормально, чтобы оставить его здесь? – DannyBoi

+0

Вы можете попробовать 'powershell '([xml] ((gc test.xml) -replace' drive ')). SelectNodes (' // drive ') |% {net use \" $ ($ _ [' letter '] .innerText): \ "$ _ ['path']. innerText}" из командной строки (заменяя 'test.xml' именем вашего xml-файла). Это будет работать только в том случае, если ваш XML имеет правильное выражение '' И правильный корневой узел. – rojo

ответ

2

Это довольно прямо с простым for цикла:

for /f "tokens=3 delims=<>" %%a in ('find "<drive letter>" test.xml') do echo %%a 

Нет необходимости, чтобы избежать > и <, потому что они находятся в безопасности в кавычки.

редактировать
создать два "массивы" (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) цитирует из замечаний на this answer

+0

'test.xml' вызывает проблемы, поэтому переименовал его в' test.txt' Спасибо, что ставит меня в правильном направлении. 'for/f" tokens = 3 delims = <> "%% a in ('find" <буква диска> ".txt ') do echo %% a для/f "tokens = 3 delims = <>" %% b in (' find "" test.txt ') do echo %% b' дает мне результат ' X Y \\ DANIEL-HP \ Users \ Public \ Documents \ Загруженные Паспорта \\ DANIEL-HP \ Users \ Public' Я работаю на получение результата, как 'X \\ DANIEL-HP \ Users \ Public \ Documents \ Загруженные данные Y \\ DANIEL-HP \ Users \ Public', а затем динамически назначать переменные. – DannyBoi

+0

логически легко, но еще немного кода. См. Мое редактирование. – Stephan

+0

+1 Спасибо @Stephan Идеальный ответ. Соберите данные сначала, затем отобразите их .... славно !!!! Наконец, завершил мой код с помощью 'net use! Drv - %% x! "! РТН - %% х!"/p: yes' блестящий :) Убрал некоторые из моих сомнений с массивами тоже. – DannyBoi

1

Простым использованием JREPL.BAT - a regular expression find/replace utility. Это чистый скрипт (гибридный пакет/JScript), который запускается изначально на любом компьютере с Windows XP без необходимости каких-либо сторонних exe-файлов.

Отказ от ответственности. В идеале вы должны использовать XML-парсер для чтения файла. Но предполагая, что файл всегда имеет xml-макет, как вы показываете, тогда из командной строки должно работать следующее.

jrepl "<(drive letter)>(.*?)</\1>\s*<(drive path)>(.*?)</\3>" "$2+': = '+$4" /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)>(.*?)</\1>\s*<(drive path)>(.*?)</\3>" "$2+'|'+$4" /m /jmatch /f test.xml' 
) do (
    echo Drive letter = %%A 
    echo Drive path = %%B 
    echo(
) 

И в outptut:

Drive letter = X 
Drive path = \\DANIEL-HP\Users\Public\Documents\Downloaded Data Sheets 

Drive letter = Y 
Drive path = \\DANIEL-HP\Users\Public 

 Смежные вопросы

  • Нет связанных вопросов^_^