2017-06-12 4 views
0

私は、3列と多くの行を持つCSVファイルを持っています。私はWindowsでコマンドを実行したいCSVファイルから引き出された変数を持つWindowsバッチファイルを提供する方法

は促し、およびCSVファイルからのコマンドに入力変数を供給し、その結果、CMD:

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プロンプトで一度に1行を実行すると実行されます。そのため、for文と読み込み機能は動作できないCSVファイルを形成します。

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

ありがとうございます!

+0

各行の先頭と末尾に二重引用符を追加し、各コンマを二重引用符で置き換えることもできます。 – Compo

+0

あなたの編集した質問とあなたのcsvファイルのサンプル行に独自のコードを追加してください。 "for/f" tokens = 1-3 delims =、 "%% A in( 'type your.csv')Echoコマンド" %%〜A "" %%〜B "" %%〜C "'は可能でしょうかあなたが必要とするものすべてになります。 – LotPings

答えて

1

投稿したコードとサンプルファイルが正確であると仮定すると、2つの無関係の問題があります。

1)
あなたIN()句は、FOR/Fは、csvファイルを実行しようとするのではなく、単に内容を読み取ることを意味しており、単一引用符を使用しています。

あなたは、CSV形式のパスは時々スペースが含まれているかもしれないという可能性がある場合は、パスを二重引用符で囲まなければならない、とあなたがしてUSEBACKQオプション

を必要とする単一引用符

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

を削除する必要があります

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 

、あなたが使用することができ、あなたがソースからスペースを削除することはできません、あなたがわからない場合

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" 
) 
) 
+0

私はエコーを除去し、それはすべて働いた。ありがとう@dbenham –

関連する問題