gpt4 book ai didi

windows - 让 FilePaths 在 Batch 中正常工作(写入文本文件)

转载 作者:可可西里 更新时间:2023-11-01 11:28:28 24 4
gpt4 key购买 nike

我正在遍历大约 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

最佳答案

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

nq 被用作标志。最好将其命名为目的标志以移除引用文档的要求。虽然将标志设置为 1/0 并使用 delayedexpansion 来访问它们的动态值将起作用,但更好的方案是将它们设置为nothingsomething 然后使用 if定义的 flagvalue 无论是否调用 delayedexpansion 都有效。

mk 是计数器值,最好命名为purposecounter 然后就不需要文档了。

mystring 是另一个无意义的变量名。最好命名为 destinationdirectory 来记录目的。在你正在做的地方设置这个变量是没有意义的 - 它完全取决于 %%f 所以在 for %%f block 的开头设置它意味着它将只为每个 %%f 设置一次,而不是每次执行内部循环时(根据提供的数据,一次对 15 次。)

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

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

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

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

关于windows - 让 FilePaths 在 Batch 中正常工作(写入文本文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27664810/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com