如何提供包含从CSV文件中提取的变量的Windows批处理文件

时间:2017-06-12 21:10:15

标签: windows batch-file

我有一个包含3列和多行的CSV文件。

我想在Windows cmd提示符下运行命令,并从CSV文件向命令提供输入变量,以便:

 cd C:\mricrogl
 for /f "tokens=1-3 delims=," %%A in ('Q:\proc9\Code\dcm2bids.csv') Do Echo dcm2niix -b y -z y -o "%%~A" -f "%%~B" "%%~C"

我需要使用该命令迭代CSV文件的长度。

CSV文件的内容如下所示(没有标题),这3列是dcm2niix命令所需的输入变量%% ~A %% ~B和%% ~C。该命令要求输入变量(文件路径和文件名)采用双引号。当我一次执行一行'手动'在cmd提示符下,因此它的for语句和读取形成了我无法工作的CSV文件。

 "V:\Output\folder1", "filename1", "Q:\Input\folder1"
 "V:\Output\folder2", "filename2", "Q:\Input\folder2"
 "V:\Output\folder3", "filename3", "Q:\Input\folder3"

谢谢!

1 个答案:

答案 0 :(得分:1)

假设您发布的代码和示例文件准确无误,那么您就会遇到两个无关的问题。

<强> 1)
IN()子句使用单引号,这意味着FOR / F将尝试执行csv文件而不是简单地读取内容。

您必须删除单引号

for /f "tokens=1-3 delims=," %%A in(Q:\proc9\Code\dcm2bids.csv) do ...

如果csv路径有时可能包含空格,那么路径必须双引号,然后您需要USEBACKQ选项

for /f "usebackq tokens=1-3 delims=," %%A in("Q:\proc9 with spaces\Code\dcm2bids.csv") do ...

<强> 2)
您的第二个问题是每个引用列值之前的前导空格。当值中的第一个和最后一个字符为引号时,~仅剥离外引号。您的第一个字符是空格,因此引号不会被删除。

无论如何,CSV不应该有这样的前导空格。

如果您控制csv文件的创建,那么我会修复该代码以消除前导空格,然后一切都应该有效。

或者,您可以依赖源中已存在的引号。但这只有在您知道引号始终存在时才有效:

... Do Echo dcm2niix -b y -z y -o %%A -f %%B %%C

如果您无法从源中删除空格,并且您不知道引号是否始终存在,那么您可以为每个标记使用额外的FOR循环来忽略不需要的空格:

cd C:\mricrogl
for /f "tokens=1-3 delims=," %%A in (Q:\proc9\Code\dcm2bids.csv) do (
  for %%a in (%%A) do for %%b in (%%B) do for %%c in (%%C) do (
    echo dcm2niix -b y -z y -o "%%~a" -f "%%~b" "%%~c"
  )
)