2015-04-08 48 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妥善处理工具...

相关问题