【发布时间】:2012-02-20 18:56:00
【问题描述】:
我正在尝试发出系统命令来运行 FreeSurfer 的 mri_convert。您不需要真正了解 mri_convert 是什么,就像您必须了解流程如何从 scala 转移到系统一样。该代码在大多数情况下都有效,但是当我尝试发送带有空格的文件路径时,它会中断(即使在我用\ 替换了空格之后)。我将在下面发布我的代码,然后是使用没有目录的文件在其路径中包含空格的输出,然后是从带有空格的目录的文件路径的输出。
def executeAll(): Boolean = {
while (dataBuf.length != 0) {
val dir = directory + "subjects/" + dataBuf.first.subjectID + "/mri/orig"
val expr = """\s+""".r
val path = expr.replaceAllIn((dataBuf.first.path), """\\ """)
val folder = new File(dir)
val execute = freesurfer + """bin/mri_convert -it dicom -ot mgz -ii """ + path + """ -oi """ + dir + """/001.mgz"""
if (folder.mkdirs()) {
val command = Process(execute, folder, ("FREESURFER_HOME", freesurfer))
val exitCode = command.!
println(command.toString())
}
dataBuf.remove(dataBuf.indexOf(dataBuf.first))
}
println("DONE")
dataListView.listData = dataBuf
true
}
输出不带空格的目录:
val path = /Applications/freesurfer/bin/mri_convert -it dicom -ot mgz -ii /Volumes/N/0110547/2008-05-24/data/BIRNSequence_4/IM-0003-0001.dcm -oi /Users/michael/Documents/subjects/dadasd/mri/orig/001.mgz
[/Applications/freesurfer/bin/mri_convert, -it, dicom, -ot, mgz, -ii, /Volumes/N/0110547/2008-05-24/data/BIRNSequence_4/IM-0003-0001.dcm, -oi, /Users/michael/Documents/subjects/dadasd/mri/orig/001.mgz]
带空格的输出目录:
val path = /Applications/freesurfer/bin/mri_convert -it dicom -ot mgz -ii /Volumes/N/0110547/2005-07-31/this\ is\ the\ data/AXBIRN_4/IM-0004-0001.dcm -oi /Users/michael/Documents/subjects/adsfsdf/mri/orig/001.mgz
mri_convert: extra arguments ("the\" and following)
[/Applications/freesurfer/bin/mri_convert, -it, dicom, -ot, mgz, -ii, /Volumes/N/0110547/2005-07-31/this\, is\, the\, data/AXBIRN_4/IM-0004-0001.dcm, -oi, /Users/michael/Documents/subjects/adsfsdf/mri/orig/001.mgz]
我认为这与传递给系统的参数在目录中用括号中的空格中断路径有关。因此,我相信我的流程是如何创建的,这很有趣。更重要的是,在每种情况下,如果我将路径的 val 剪切并粘贴到终端中,mri_convert 程序都会按预期执行。
提前致谢,如果需要更多详细信息,请告诉我。
【问题讨论】: