让文件路径在批处理中正常工作(写入文本文件)

时间:2014-12-27 05:55:18

标签: windows batch-file

我正在遍历大约300个目录并尝试在每个目录中创建一个文本文件。除文件创建和后续编写外,我的所有代码都有效。以下是我尝试写入文件的方式:(我应该注意,此代码在使用setlocal EnableDelayedExpansion的嵌套for循环中)

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

2 个答案:

答案 0 :(得分:2)

有足够的圣诞精神让我回应。

nq被用作标记。最好命名为目的标志,以删除引用文档的要求。将标志设置为1/0并使用delayedexpansion访问其动态值将起作用,更好的方案是将它们设置为 nothing 某些然后使用{{1}无论是否调用delayedexpansion都可以。

if defined flagvaluem是计数器值,更好地命名为目的计数器,然后不需要文档。

k是另一个无意义的变量名。更好地命名mystring来记录目的。将此变量设置在您正在执行的位置是没有意义的 - 它完全取决于destinationdirectory,因此在%%f块的开头设置它意味着它只会为每个{{1}设置一次并非每次执行内部循环(在提供的数据上,一次反对15次。)

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

如果您使用引号括住目标文件名,则该过程会创建目标文件,因为它显然是但是,因为这是%%f扫描的同一目录中的另一个文件,然后是filename %%~dpf将出现在该目录中,您的进程将尝试将该文件用作数据源,尝试创建%%f并且此目录不存在(temporary.txt来自{{ 1}}由子字符串处理到位置dirname\t\temporary.txt。使用t可以解决该问题(但不能扫描此过程创建的文件)

要跳过dirname\temporary.txt文件的扫描,您可以在-12之后添加%%~dpf作为门,或者对所需目录使用temporary.txt扫描作为列表到源if /i "%%~nxf" neq "temporary.txt",因为列表将在处理之前完全生成,因此排除了在该过程中生成的文件。

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

答案 1 :(得分:1)

仅限注射:

  • 省略"delims=%TabChar%",因为以下任何内容始终是有效的分隔符:逗号 ,分号 ;等于 =空间 标签
  • ==的比较总是 textual ;因此省略所有==周围空间;为了最好的结果,环绕比较字符串与例如引用如下:if NOT "%%i"=="Species" ( ...
  • 不要将echo重定向到文件,而是尝试使用echo !m! ^>^> !myString:~0,-12!\temporary.txt查看所有命令