2015-04-08 82 views
1

我想創建一個批處理文件,該文件將根據.DWG文件名搜索文件夾並創建.XML文件。它還會將文件名添加到(2).XML內的不同位置(參見下文)。批處理腳本 - 創建.XML文件 - 基於文件夾中的每個.DWG文件的名稱

過程:

  1. 一個文件夾中包含編號A1.dwg〜A100.dwg(100)圖紙文件
  2. 批處理文件,會發現這些文件名,並創建相應的.XML文件
  3. 01:在.xml文件(2)線將根據文件名

文件 「A26」 XML內容進行編輯項

文件 「A42」 XML內容:

<?xml version="1.0" encoding="UTF-8"?> 
<File Name="A42"><Version>1</Version><Description>A42</Description><Region><Cell Level="2" Division="1"/><Cell Level="2" Division="1"/></Region></File> 

文件 「A74」 XML內容:

<?xml version="1.0" encoding="UTF-8"?> 
<File Name="A74"><Version>1</Version><Description>A74</Description><Region><Cell Level="3" Division="1"/><Cell Level="3" Division="1"/></Region></File> 

我可以整理出以下基於另一個查詢,但是,它的不爲我工作...任何你可以提供將非常感激。

順便說一句,"targetdir=C:\USC VILLAGE"是我試圖輸出這些文件的位置,但我希望能夠編輯此路徑並在任何可能的地方創建這些文件。

@ECHO OFF 
SETLOCAL 
SET "targetdir=C:\USC VILLAGE" 
SET /a filecount=0 
SET "and_subdirs=" 
:again 
PUSHD "%targetdir%" 
FOR %and_subdirs% %%a IN (
    "*.dwg" 
) DO (
    SET /a filecount+=1 
    >"%%~dpna.xml" (
    ECHO(^<?xml version="1.0" encoding="UTF-8"?> 
    ECHO(  <File Name="%%~na"> 
    ECHO(  <Version>1</Version> 
    ECHO(  <Description>%%~nxa"</Description> 
    ECHO(  </File^> 
) 
) 
) 
) 
popd 
IF NOT DEFINED and_subdirs IF %filecount%==0 SET "and_subdirs=/r"& GOTO again 
ECHO(%filecount% files found 
IF DEFINED and_subdirs ECHO(Subdirectories were scanned 

GOTO :EOF 

感謝, DOrtega

+1

凡'<單元級別= 「3」 司= 「1」/>'從何而來?爲什麼在你所有的_XML Contents_ description中加倍? – JosefZ

+0

它必須是批處理,或者是例如'perl'(它可以在Windows上運行)一個選項嗎?我想問的原因 - XML看起來比以前複雜得多,使用合適的解析器可以幫助大衆。 – Sobrique

+0

@ JosefZ-I'll必須確認細胞水平和分裂以及它們是否重複。這些與AutoCAD直接相關。這種信息的位告訴AutoCAD的什麼級別的文件被關聯到(例如3級),和分割(例如:區域4) –

回答

0

我知道這是不太你要求什麼,但我還是要去,以提供它。它是Perl,而不是批處理,因爲:

  • Perl也會在Windows上運行。
  • Perl處理XML要比批處理好得多。

爲了得到這個從頭開始運行」,你將需要:

我不清楚你是怎麼想出細胞水平和分裂,所以使用佔位符值。應該很容易相應地修改它。

#!/usr/bin/perl 

use strict; 
use warnings; 

use XML::Twig; 
use File::Find; 

#read search and output dirs from command line, but use defaults if not present. 
my ($search_dir, $output_dir) = @_; 
$search_dir = 'C:\\temp\\dwg' unless defined $search_dir; 
$output_dir = 'C:\\temp'  unless defined $output_dir; 

sub process_file { 
    return unless m/\.dwg$/; 
    print "Processing $File::Find::name\n"; 
    my $base_name = $_; 
    #extract the 'A24' bit. 
    $base_name =~ s#\.dwg$##gi; 
    print "Using $base_name\n"; 

    #start assembling XML: 
    my $xml = XML::Twig->new(pretty_print => 'indented'); 

    #create a 'File' roote element. 
    $xml->set_root(
     XML::Twig::Elt->new('File', { "Name", $File::Find::name })); 

    #insert Version and description into root element. 
    $xml->root->insert_new_elt('Version',  1); 
    $xml->root->insert_new_elt('Description', $base_name); 

    #create a region element, with subelements 'Cell' 
    my $region = $xml->root->insert_new_elt('last_child', 'Region'); 
    $region->insert_new_elt(
     'Cell', 
     { 'Level' => 1, 
      'Division' => 1, 
     } 
    ); 
    $xml->print; 

    open(my $output_file, ">", "$output_dir/$base_name.xml") or warn $!; 
    print {$output_file} $xml->sprint; 
    close($output_file); 
} 


find(\&process_file, $search_dir); 
+0

-Batch僅用於創建XML,因爲它不需要額外的程序來安裝和/或學習其他團隊成員。我很感激這方面的幫助,並會進一步研究它,但是,我想暫時堅持批處理文件。 –

+0

這很公平。但我會提醒你 - 你正在爲自己的背部製作一根杖。 XML是一個複雜的構造,解析它並不是微不足道的。我不會這麼做 - 不能一次批量完成,但在非常嚴格的數據格式中跳轉非常容易。 – Sobrique

0

如果你的腳本可以工作,你會escape所有<(小於)和>(大於)與正常^轉義字符的字符所有echo命令(而不是在>"%%~dpna.xml" (線)如下:

>"%%~dpna.xml" (
    ECHO(^<?xml version="1.0" encoding="UTF-8"?^> 
    ECHO(^<File Name="%%~na"^> 
    ECHO( ^<Version^>1^</Version^> 
    ECHO( ^<Description^>%%~nxa^</Description^> 
    ECHO(^</File^> 
    ) 

然而,我懷疑輸出文件可能會被迫UTF-8編碼與CLI批處理(至少在this CHCP article中多讀)。

我跟着Sobrique的建議:切換到另一個,xml妥善處理工具...

相關問題