为什么在批处理脚本中不能正确解释多个带空格的参数?

问题描述 投票:0回答:4

我正在运行一个带有多个参数的 exe,这些参数可能包含也可能不包含空格。我用引号将它们括起来,但它们以某种方式没有正确传递给 exe。

这是我正在使用的命令:

makeblastdb -in "D:\d b\sequence.fasta" -input_type fasta -dbtype prot -title xd -out "D:\d b\xd"

我认为 cmd 应该将 10 个参数传递给 exe,但不知何故它没有正确传递。

这是我得到的结果

BLAST options error: File "D:\d" does not exist.

这基本上是说第二个参数由于某种原因被砍掉了?

任何帮助将不胜感激,谢谢!

batch-file cmd
4个回答
3
投票

根据您对问题的评论,BLAST 实用程序无法正确处理带空格的引号路径,并且您的卷不支持短文件名。

显然,您可以将工作目录移动到不包含空格的路径。

另一种方法是使用 SUBST 临时创建一个指向您有问题的路径的虚拟驱动器。

subst K: "d:\d b"
makeblastdb -in "K:\sequence.fasta" -input_type fasta -dbtype prot -title xd -out "K:\xd"
subst /d K:

Type

subst /?
获取命令帮助。

根据您正在 python 中运行命令的事实进行更新

在你对这个答案的评论中,你声明你将尝试让命令在 python 中工作。这可能是你问题的全部根源。

您应该尝试直接从 Windows 命令提示符(cmd.exe 控制台)运行问题中的命令。

如果命令在命令提示符下不起作用,那么问题确实出在 BLAST 实用程序上,而 SUBST 是一个很好的解决方案。

如果命令在命令提示符下运行,那么问题出在你如何从 python 中提取命令,并且不需要 SUBST 命令。

我不是python用户,但是我看到很多人在Windows上使用python的时候都有类似的问题。也许这会有所帮助:How do I execute a program from python? os.system 由于路径中的空格而失败


2
投票

makeblastdb 有一个奇怪的转义约定。试试这个:

-in \""D:\d b\sequence.fasta"\"

不幸的是,这不适用于 -out,所以 dbenham 的答案可能是最好的。


0
投票

替代方法是您可以尝试使用“

D:\d b
”的目录短名称,您可以通过在 D 驱动器上运行
dir /X
命令找到它。例如,如果我在我的 C 驱动器上运行 dir /X,我得到的是:

01/21/2013    09:47 AM    <DIR>      PROGRA~1     Program Files

所以你想使用

C:\Program Files
你也可以使用
C:\PROGRA~1
.


0
投票

这里在 Windows 中对我有用的答案是创建一个瞬态虚拟驱动器,如 dbenham 所示(但这对于可能在不同计算机上运行的一般自动化过程来说不是一个可行的解决方案,并且对于多个并行来说效率低下且不切实际线程操作)或获取 Jugal Shah 指出的短路径字符串(这并不总是很方便,因为它需要访问 kernel32.dll 的非托管代码才能在 C# 中使用,例如)。但是,如果您从源代码重新编译必要的 blast 项目文件,则修复起来很容易。

如果您能够下载 blast 项目代码(例如来自 https://ftp.ncbi.nlm.nih.gov/blast/executables/blast+/2.12.0/ 的版本 2.12.0),您可以重建 makeblastdb .exe 在仅修改两行代码并重建 makeblastdb 之后,当路径中有空格时,用引号括起来的数据库目标应该可以正常工作。注意:在首先遵循 ncbi 代码包中包含的项目配置说明并构建和测试 makeblastdb.exe、blastn.exe 和 blast_formatter.exe 后,在 Windows 11 和 Visual Studio 2019 中使用 v2.12.0 进行了测试。

要修改的代码行:

-- 在 . cbi-blast-2.12。

© www.soinside.com 2019 - 2024. All rights reserved.