2016-08-29 13 views
-2

IDで命名されたサウンドファイルがあります。音を見つける唯一の方法は、各ファイル名を持つ参照バンクを調べることです。XMLファイルのファイル名を使用してサウンドファイルを整理するバッチスクリプト

私が達成したいのはIDを見つけるスクリプトで、ファイルの名前を変更してそのファイルを整理する 'Path'です。

<File Id="14518742" Language="SFX"> 
     <ShortName>Creatures\Fish_Large_Swim_03.wav</ShortName> 
     <Path>SFX\Creatures\Fish_Large_Swim_03_9344E057.wem</Path> 
</File> 

タスクの要件::ファイル名であるID 14518742を持って<file ...を探す、例えばここで

は、音に関する情報が含まれているXMLからのデータであり、 14518742.ogg。私は、文字列をトリミングしようとしている問題を解決することができませんでした

@FOR /F "delims= " %%i IN ('find "<File Id=" Bankinfo.xml') DO @(
    @for /f "delims= " %%a in ("%%i") do @(
     set %%i=%%a 
     set %id%=%%i 
     Rem This was an attempt to trim the string, thing is that I can't find out why this doesn't work, because percentage signs. 
     set %id%=%id:~-7,7% 
     ) 
    ) 
pause 

:私もIDを取得することはできません原因無能に

SFX\Creatures\Fish_Large_Swim_03_9344E057 

:私は<Path>に保存されているディレクトリにファイルを移動したいです私はデリミタを使用することしかできませんでした。それでも、私はおそらくこれを完了することができません。

編集#2:長すぎるため「広すぎるとしてください」と改訂されました。私は、このサイトでの質問方法については、少なくともCMDでのスクリプト作成や適切なエチケットについてはあまり知らないので、お詫び申し上げます。

+0

は、XML処理は、他のプログラミング言語に適しています。 – DavidPostill

+3

https://stackoverflow.comは無料のスクリプト/コード作成サービスではありません。これまでに試したこと(既に使用しているスクリプト/コードを含める)とどこにいるのかを教えていただければ、特定の問題を解決することができます。 [良い質問をするにはどうすればいいですか?](https://stackoverflow.com/help/how-to-ask)も読んでください。 – DavidPostill

答えて

1

すべて* .OGGファイルやXMLデータでも、ファイルXmlFile.xmlを含むとディレクトリに実行される次のバッチコードを使用することができます。

注:delims=<>間の性質上、 3行目は水平タブ文字でなければなりません。ブラウザーは、HTML標準に従ってタブ文字を表示し、単一スペース文字としてコピーします。プロセスFOR

@echo off 
setlocal EnableExtensions EnableDelayedExpansion 
for /F "usebackq tokens=1* delims=< > " %%A in ("XmlFile.xml") do (
    if "%%A" == "File" (
     for /F "tokens=2 delims== " %%C in ("%%B") do set "OggFileName=%%~C.ogg" 
    ) else if "%%A" == "Path" (
     set "TargetPath=%%B" 
     set "TargetPath=!TargetPath:~0,-11!" 
     for /F "delims=" %%F in ("!TargetPath!") do set "NewFileName=%%~nxF.ogg" 
     if not exist "!TargetPath!" md "!TargetPath!" 
     if exist "!OggFileName!" (
      move /-Y "!OggFileName!" "!TargetPath!\!NewFileName!" 
     ) else (
      echo There is no file !OggFileName! in folder %CD%. 
     ) 
    ) 
) 
endlocal 

最も外側各行は、XMLファイルから読み込まれ、二つの文字列の中にまで、各非空行を分割:要素名が原因tokens=1のループ変数Aに割り当てられている

  1. File,ShortName,Pathおよび/Fileであり、最後のものは無視され、/が区切り文字のリストに指定されていない理由である。

    Id="14518742" Language="SFX"> 
    Creatures\Fish_Large_Swim_03.wav</ShortName> 
    SFX\Creatures\Fish_Large_Swim_03_9344E057.wem</Path> 
    

  • 要素名の後にスペースまたは>後に残っている行は、このため、例えばあるtokens=1後添付*A後ASCIIテーブル内の次の文字である次のループ変数Bに割り当てられています

    ループ変数Aの値の大文字と小文字を区別した比較が行われ、処理が必要な行が識別されます。

    要素名がFileの行に*のファイル名が含まれています。属性値Idのoggファイルのための別のを区切り文字として等号とスペース文字を使用してループ変数Bに割り当てられた文字列を分割するために使用されます。

    文字列Id="14518742" Language="SFX">から、tokens=2を使用する理由である等号の後に2番目の部分文字列"14518742"が重要です。二重引用符なし及び添付.oggとこの文字列は、後で使用するために環境変数OggFileNameに割り当てられます。

    関心のもう一つの要素は、フォルダのパスとも* .OGGファイルのファイル名を含むPathです。

    したがって、ループ変数Bに割り当てられた文字列SFX\Creatures\Fish_Large_Swim_03_9344E057.wem</Path>から、最後の11文字が削除され、ターゲットフォルダのパス文字列SFX\Creatures\Fish_Large_Swim_03_9344E057が取得されます。

    もう一度コマンド FOR は、環境変数NewFileNameに* .OGGファイルの新しいファイル名である必要があり、最後のバックスラッシュの後の文字列を割り当てられて取得するために使用されます。 %%~nxFがファイル名の場合だけではなく%%~nFのに使用される前に、リードエクステンション.wemが既に削除されたため、ファイル拡張子セパレータとしてファイルの既に切り捨て名に解釈されるものより多くの点を含みます。

    既に存在し、現在のディレクトリ内にあるすべての既存の場合* .OGGファイルは、新しいファイル名を指定して、このディレクトリに移動されていない場合は次のディレクトリが作成されます。ファイル名としてIDを維持してファイルを移動させるための

    、ちょうどライン環境変数NewFileNameのファイル名を決定した上で以下のバッチコードを使用して、ライン上のこの環境変数の遅延拡張参照コマンドMOVEを除去したと上記のバッチコードとの比較使用するコマンドを理解し、どのように彼らは、コマンドプロンプトウィンドウを開き、そこに次のコマンドを実行し、完全にページが非常に慎重に、各コマンドのために表示されているすべてのヘルプを読んで、仕事のため

    @echo off 
    setlocal EnableExtensions EnableDelayedExpansion 
    for /F "usebackq tokens=1* delims=< > " %%A in ("XmlFile.xml") do (
        if "%%A" == "File" (
         for /F "tokens=2 delims== " %%C in ("%%B") do set "OggFileName=%%~C.ogg" 
        ) else if "%%A" == "Path" (
         set "TargetPath=%%B" 
         set "TargetPath=!TargetPath:~0,-11!" 
         if not exist "!TargetPath!" md "!TargetPath!" 
         if exist "!OggFileName!" (
          move /-Y "!OggFileName!" "!TargetPath!\" 
         ) else (
          echo There is no file !OggFileName! in folder %CD%. 
         ) 
        ) 
    ) 
    endlocal 
    

    • echo /?
    • endlocal /?
    • for /?
    • if /?
    • move /?
    • set /?
    • setlocal /?
    それはバッチで行うことができるが、
  • 関連する問題