2017-12-07 17 views
1

Windowsのコマンドラインで米国42州に対して42回別々に実行可能ファイル(C#で書かれたもの)を実行する必要があります。私はプロセスを自動化するバッチファイルを書いた。実行可能ファイルへの1番目のユーザー入力は1、2番目は状態の省略形(AL、AZ、CTなど)です。私はそれを行うには、次のスクリプトを書いた:Windowsのバッチスクリプトでデータをパイプする際に余分な空白を避ける

AL

AZ

CT

を次のように

@echo off 

for /f "tokens=1 delims=" %%x in (CropHailStates.txt) do (

    (echo 1 & echo %%x)|Z:\Models\LossCalc.exe 
) 

はCropHailStates.txtファイルの各行には、州の略称が含まれています現在、手動モードでは、1番目のプロンプトで1を入力し、2番目にALを入力すると、C#プログラムは "AL.Even.CropLoss.csv"という名前のファイルを読み込みます。しかし、バッチスクリプトを実行して自動的に実行すると、 "AL.Even.CropLoss.csv"というファイルが見つからないというエラーメッセージが表示されます。この問題は、ALの後の余分な空白に関連しています。これは、状態の省略形を挿入した後に何とか空白を追加します。州の省略形を書いた後、しかしEnterを押す前に、スペースバーを押すようなものです。

ファイル名の余分な空白を取り除くにはどうすればよいですか?あなたが行うことができます最後の文字(空白)を取り除くために

答えて

-1

@echo off 
setlocal EnableDelayedExpansion 

for /f "tokens=1 delims=" %%x in (CropHailStates.txt) do (
    set "result=%%x" 
    (echo 1 & echo !result:~0,-1!)|Z:\Models\LossCalc.exe 
) 

はそれがお役に立てば幸いです。

+0

スペースはデータから来ていません。これはカッコを使用することによる副作用のようです。これをテストすれば、私の言いたいことが分かります。 '(echo 1&echo AZ)| findstr" 1 AZ ">> test.txt'。 – Squashman

+0

@スカッシュマン:うーん。あなたのコードは私のために各行にターミナルスペースを与えました(ファイルサイズは9バイト)が、パイプが削除されたときには出力にはスペースがありませんでした。 '&'の後の 'echo'の前のスペースは無効です... – Magoo

+0

[カッコで囲まれたブロックがパイプされていると遅延拡張が機能しません](https://stackoverflow.com/q/8192318/1012053) )。加えて、根本的な問題に対処していません。 – dbenham

2
(echo 1& echo %%x)>tempfile.txt 
    Z:\Models\LossCalc.exe <tempfile.txt 
    del tempfile.txt 

は末尾のスペース

+0

これは完全に機能します!しかし、@dbenhamが提供する他の3つのソリューションには、一時ファイルを作成する必要がないという利点があります。 –

3

問題は、コードの括弧内のブロックを扱うパイプパーサのアーティファクトであることなく、データを提供すべきです。

問題の原因は、jebでWhy does delayed expansion fail when inside a piped block of code?と記載されています。 パイプの各側が新しいCMD/Cプロセスで実行されます。 CMD/C

(
    echo line 1 
    echo line 2 
) | findstr "^" 

介し

複数行括弧ブロックがパイプを取得したときに、それが実行できるように、パーサは、単一の行にブロック全体を再パッケージしなければならないが、パイプの左側が実行されます次のようになります。

C:\WINDOWS\system32\cmd.exe /S /D /c" (echo line 1 & echo line 2)" 

追加された空白が表示されます。

あなたのコードはすでに1行になっていますが、それらの厄介な部分を紹介するのと同じパーサをそのまま使います。

私は、一時ファイルを必要とせずに不要なスペースを排除する比較的簡単な3つのソリューションを知っています。

1)あなたは明示的にCMD/C

が実行されるまで、可変遅延展開におけるコマンドの

@echo off 
for /f "tokens=1 delims=" %%x in (CropHailStates.txt) do (
    cmd /c "echo 1&echo %%x"|Z:\Models\LossCalc.exe 
) 

2)お店の一部を探している正確な動作を取得し、余分なCMD/Cを追加します。だから私は

を提供することをリンクジェブによって開発された心吹い技術彼は同じで説明していること -
@echo off 
setlocal 
for /f "tokens=1 delims=" %%x in (CropHailStates.txt) do (
    set "cmd=&echo %%x" 
    (echo 1%%cmd%%)|Z:\Models\LossCalc.exe 
) 

3)改行変数の遅延拡張を導入

関連する問題