2014-12-27 21 views
1

我遍历了大约300个目录并尝试在每个目录中创建一个文本文件。我的所有代码都可以工作,除了文件创建和后续写入。以下是我正在试图写入文件:(我要指出,这个代码是内嵌套的for循环使用SETLOCAL EnableDelayedExpansion)使FilePaths在批处理中正常工作(写入文本文件)

if !q! == 0 (
    set myString=%%f 
    set myString=!myString:~0,-12!\temporary.txt   
    echo !m! >> !myString! 
) 

其中%% f是路径,另一个文本文件我做一个分析,所以我必须缩短路径。这个文本文件的名称在所有目录中是统一的。我曾尝试只是使用:

echo !myString! 

产生的示例输出(正确的文件路径):

C:\mywork2\MAX\BOTH0\temporary.txt 

然而,当我运行的完整代码块上方我接收:

The fimename, directory name, or volume label syntax is incorrect. 

如果我使用:

if !q! == 0 (
    set myString=%%f  
    echo !m! >> !myString:~0,-12!\temporary.txt 
) 

程序运行时没有错误,但从未创建文本文件。但是,如果我手动键入路径(不可能迭代),则创建文本文件。我究竟做错了什么?


这里是目录布局:C:\ mywork2 \ MAX \(arbitrary_name)\ dataSet.txt ||和C:\ mywork2 \ Trees_Orig \(系统发育树)。

实施例的数据集(从系统发生树):

#NEXUS 
begin taxa; 
    dimensions ntax=5020; 
    taxlabels 
    Tachyglossus_aculeatus 
    Zaglossus_bruijni 
    Zaglossus_bartoni 
    Ornithorhynchus_anatinus 
    Anomalurus_derbianus 
    Anomalurus_beecrofti 
    Anomalurus_pelii 
    Anomalurus_pusillus 
    Microtus_townsendii  
    Peromyscus_californicus 
    Odocoileus_hemionus 
    Canis_latrans 
    Canis_lupus 
    Urocyon_cinereoargenteus 
    Vulpes_vulpes 
    Lynx_lynx 
    Euchoreutes_naso 
    Jaculus_blanfordi 
    Jaculus_jaculus 
    Jaculus_orientalis 
    Stylodipus_andrewsi 
    Stylodipus_sungorus 
    Monodelphis_iheringi 

实施例的数据集(从dataSet.txt):

Species 
Microtus_townsendii  
Peromyscus_californicus  
Odocoileus_hemionus  
Canis_latrans  
Canis_lupus  
Urocyon_cinereoargenteus   
Vulpes_vulpes  
Lynx_lynx  
Puma_concolor  
Gulo_gulo  
Mephitis_mephitis  

变量名:

k: is used to simulate an array, by serving as the indexes to each species in dataSet.txt 
f: is a dataSet.txt from C:\mywork2\MAX\* 
i: represents the first tab delimited term of each dataSet.txt row (I've truncated this for you) 
g: is a .tre phylogenetic tree (there's 2), but I have truncated it's length due to example 
j: represents the first term of each row within the phylogenetic tree 

q: serves as a boolean variable which is 1 when a species from the phylogenetic tree 
    is also in the dataSet.txt file. Otherwise 0. 
n: serves as a boolean variable to tell when the batch file is examining species from the 
    phylogenetic tree and not meta data. 

m: is the index of each species within the phylogenetic tree. These are written to a text file 
    when q = 0. This is because I will be creating a Paup block within a .NEX file to remove all 
    species within the phylogenetic tree not present in dataSet.txt. 

myString: this variable is used to hold a truncated file path. I want each temporary.txt file to 
      be in the same directory as its respective dataSet.txt file. 

编辑:这是我的代码 - >

setlocal EnableDelayedExpansion 
SET "TabChar= " 

for /r C:\mywork2\MAX\ %%f in (*) do (
    set k=0 
    for /f "delims=%TabChar%" %%i in (%%f) do ( 
     if NOT %%i == Species (
      set /A k+=1 
      set elem[!k!]=%%i 
     ) 
    ) 

    for /r C:\mywork2\Trees_Orig\ %%g in (*) do (
     set m=0 
     set n=0 

     for /f %%j in (%%g) do (
      set q=0 

      if !n! == 1 (
       set /A m+=1 
       for /L %%i in (1,1,!k!) do (
        if !elem[%%i]! == %%j (
         set q=1 
        ) 
       ) 

       if !q! == 0 (
        set myString=%%f  
        echo !m! >> !myString:~0,-12!\temporary.txt 
       ) 
      ) 

      if %%j == taxlabels (
       set n=1 
      ) 

      if %%j == Monodelphis_iheringi (
       set n=0 
      ) 

     ) 

     PAUSE 
    ) 
) 

PAUSE 
+0

请发表您足够的代码,使别人的问题的再现机器。包括一个代表性的子树列表和足够的变量目的细节以便分析。 – Magoo

+0

现在处理变量。 – user3834916

+0

更好吗? – user3834916

回答

2

有足够的圣诞节期间的精神给我留下回应。

nq被用作标志。更好地命名为目的标志删除要求以参考文档。而标志设置为1/0和使用delayedexpansion访问他们的动态值将工作,更好的方案是将它们设置为什么东西然后用if defined flagvalue其中工程delayedexpansion是否被调用或没有。

mk是计数器值,更好地命名为目的计数器则不需要文档。

mystring是另一个没有意义的变量名。更好地命名为destinationdirectory来记录目的。设置这个变量没有任何意义 - 它完全取决于%%f,因此在for %%f块的起始处设置它意味着它不会每次执行内循环时都会为每个%%f设置一次(在数据提供,一次15次。)

分配给mystring的值也显得不稳定 - 依赖于文件名的长度在%%f。由于您只是选择驱动器和路径,因此%%~dpf是更好的选择。

如果你用引号括的目标文件名,进程创建的明显预期,因为这是在同一目录下的另一个文件是由%%f扫描,接着文件名temporary.txt会出现在目录和目标文件您的进程将尝试使用该文件作为数据源,试图创建dirname\t\temporary.txt,并且该目录不存在(tdirname\temporary.txt来的dirname\temporary.txt由子字符串处理到位置-12。使用%%~dpf可以解决该问题(但不扫描文件由此创建)

要跳过对temporary.txt文件的扫描,您可以在for ... %%f...do之后添加if /i "%%~nxf" neq "temporary.txt"作为门,或者使用dir/s/b扫描所需目录作为源%%f的列表,因为该列表在处理发生之前完全生成,所以不包括在该过程中生成的文件。

我从提供的数据中获得的结果是1 2 3 4 5 6 7 8 17 18 19 20 21 22 23但是您没有发布预期结果,所以我不知道该结果是否正确。

+0

非常感谢,它的作品!我迫不及待想要阅读%%〜dpf,%%〜nxf和扫描。 – user3834916

1

只有一些注射:

  • 省略"delims=%TabChar%",如下列任何一项都总是有效的分隔符:逗号,分号;的Equals=空间标签
  • 比较wi th ==总是文本;因此省略所有的==周围空间;为了最好的结果,将比较的字符串与例如报价如下:if NOT "%%i"=="Species" ( ...
  • 不是重定向回声到一个文件的彻头彻尾,尽量echo !m! ^>^> !myString:~0,-12!\temporary.txt看到所有命令
相关问题