如何为Windows批处理文件提供从CSV文件提取的变量
我有一个3列多行的CSV文件 我想在Windows cmd提示符下运行命令,并从CSV文件向命令提供输入变量,例如:如何为Windows批处理文件提供从CSV文件提取的变量,windows,batch-file,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命令
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)
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"
)
)
您可以在每行的开头和结尾添加双引号,同时将每个逗号替换为双引号空格双引号。将您自己的代码附加到您编辑的问题和csv文件的示例行中
对于/f“tokens=1-3 delims=,”%%A in('type your.csv')Do Echo命令“%%~A”“%%~B”“%%~C”
可能就是您所需要的全部内容。我删除了Echo,一切正常。非常感谢@dbenham