0

ネットワーク ドライブを以下の形式の 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>

/ <>シンボル を解析する方法がわかりません。

4

2 に答える 2

2

これは、単純なforループで非常に簡単です。

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

>and<は引用符内で安全であるため、エスケープする必要はありません。

edit
は、文字とパスの 2 つの「配列」(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)この回答に対するコメントのために引用

于 2016-07-30T06:03:04.517 に答える
1

JREPL.BAT - 正規表現の検索/置換ユーティリティを使用して簡単に。これは純粋なスクリプト (ハイブリッド バッチ/JScript) であり、サード パーティの exe ファイルを必要とせずに、XP 以降の任意の Windows マシンでネイティブに実行されます。

免責事項 - 理想的には、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(
)

そして出力:

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

Drive letter = Y
Drive path = \\DANIEL-HP\Users\Public
于 2016-07-30T13:33:04.740 に答える