2016-07-30 28 views
0

Ich habe das Netzwerklaufwerk in einer XML-Datei im folgenden Format gesichert.Windows Batch/cmd-Datei zum Extrahieren von Netzlaufwerken (Zeichenfolgen zwischen Trennzeichen)?

Ich möchte eine Batch- oder Cmd-Datei ausführen, um den Laufwerksbuchstaben und Pfad zwischen den Trennzeichen zu extrahieren und sie dann zuzuordnen.

Der Einfachheit halber ignorieren wir, ob andere Laufwerke zugeordnet sind oder nicht.

Trennzeichen für den Laufwerksbuchstaben sind <drive letter> und </drive letter>. Trennzeichen für Ansteuerpfad sind <drive path> und </drive path>

Ich bin nicht sicher, wie die /<> Symbole zu analysieren.

+0

ich dies auf Super-User zu schreiben bedeuten, ist es in Ordnung, es hier zu verlassen? – DannyBoi

+0

Sie könnten 'powershell' versuchen ([xml] ((gc test.xml) -replace 'Laufwerk')). SelectNodes ('// drive') |% {net use \ "$ ($ _ ['letter'] .innerText): \ "$ _ ['path']. innerText}" 'von der Eingabeaufforderung cmd (ersetzt' test.xml' durch den Namen Ihrer XML-Datei). Das funktioniert nur, wenn Ihr XML eine richtige '> Deklaration und einen richtigen Root-Knoten hat. – rojo

Antwort

2

die mit einer einfachen for Schleife ganz gerade ist:

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

Keine Notwendigkeit > und <, zu entkommen, weil sie innerhalb der Anführungszeichen sicher ist.

bearbeiten
aufbauen zwei "Arrays" (1) für den Buchstaben und den Pfad, so dass sie dann kommen Sie um das gewünschte Ergebnis zu erhalten:

@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) zitiert, weil der Kommentare auf this answer

+0

'test.xml' verursacht Probleme, also umbenannt in' test.txt' Danke, das bringt mich in die richtige Richtung. 'for/f" Token = 3 delims = <> "%% a in ('finde' " test.txt ') echo %% a für/f "Token = 3 delims = <>" %% b in (' finde ' "test.txt') echo %% b' gibt mir ein Ergebnis ' X Y \\ DANIEL-HP \ Benutzer \ Dokumente Public \ \ Downloaded Datenblätter \\ DANIEL-HP \ Benutzer \ Public' ich immer das Ergebnis als 'X arbeite \\ DANIEL-HP \ Users \ Public \ Documents \ Downloaded Data Sheets Y \\ DANIEL-HP \ Users \ Public' und dann Variablen dynamisch zuweisen. – DannyBoi

+0

logisch einfach, aber etwas mehr Code. Siehe meine Bearbeitung. – Stephan

+0

+1 Dank @Stephan Perfekte Antwort. Sammeln Sie die Daten zuerst dann zeigen Sie es .... schön !!!! Endlich habe ich meinen Code mit 'net use! Drv - %% x! "! pth - %% x!"/p: yes' brilliant :) Habe einige meiner Zweifel mit Arrays auch gelöscht. – DannyBoi

1

Einfach mit JREPL.BAT - a regular expression find/replace utility. Es ist ein reines Skript (hybrid batch/JScript), das nativ auf jedem Windows-Rechner ab XP ausgeführt wird, ohne dass exe-Dateien von Drittanbietern benötigt werden.

Haftungsausschluss - Idealerweise sollten Sie einen XML-Parser verwenden, um die Datei zu lesen. Aber vorausgesetzt, die Datei hat immer ein XML-Layout, wie Sie es anzeigen, sollte das folgende von der Befehlszeile aus funktionieren. Hier

jrepl "<(drive letter)>(.*?)</\1>\s*<(drive path)>(.*?)</\3>" "$2+': = '+$4" /m /jmatch /f test.xml 

ist der Ausgang, wenn ich in „test.xml“ Ihre Probe xml setzen

X: = \\DANIEL-HP\Users\Public\Documents\Downloaded Data Sheets 
Y: = \\DANIEL-HP\Users\Public 

Ich gehe davon aus Sie die Werte als Variablen innerhalb eines Batch-Skript möchten. Sie können eine FOR/F-Schleife verwenden, um die Wertepaare zu verarbeiten:

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

Und die outptut:

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

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