質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Q&A

解決済

3回答

3335閲覧

パイプとechoを使用した変数の引き渡し

wussy0301

総合スコア0

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

0グッド

0クリップ

投稿2020/06/17 10:51

編集2020/06/18 00:18

現在、対話式の自作のプログラムを呼び出し、インプットデータとアウトプットデータを入力させ
プログラムを実行するという簡単なバッチファイルを作成しております。

そこで、パイプとecho機能を使用して、プログラムに変数を引数として渡そうとしているのですが
引数の部分に何も代入されず(ファイル名が表示されず)、パイプは終了しました、とエラーが出てしまいました。
以下に、コードを掲載させていただきます。

――――ここから――――

@echo off
set PROGRAM=Z0.exe ←プログラム名
set INUPUT=dd.dat ←インプットデータ
set OUTPUT=a.prn ←アウトプットデータ

echo %INPUT% %OUTPUT% | call %PROGRAM%

――――ここまで――――

エラーメッセージですが、

INPUT DATA ===> (空白)
OUTPUT DATA ===> (空白)
forrtl:パイプは終了しました。
forrtl:致命的なエラー(24):読み取り中にファイルの最後に達しました。

といった具合です。

プログラムは起動すると、インプットデータとアウトプットデータの名前をそれぞれ入力し
簡単な計算を実行するものです。

ちなみにOSはwindows10です。

ご回答よろしくお願いいたします。

-----6/18追記-----

Z0.exeのプログラムに原因があるのではないかというご指摘をいただいたので
以下にプログラムソースの一部を記載させていただきます。

INTEGER NUMP1 ,NUME1,NUMP,K,I,J,N1,N2,N3,N4,KX(100000,8),NY,NX, 1 N5,N6,N7,N8 ,KM(100000,30),NEP,NZ,NM, KL 2 J4,J41,J42, KNODE(2000000), KX8(2000000) 3 , K1,K2,K3,k4,K5,K6,K7,K8,J8,J81,J82 DIMENSION XE(200000),YE(200000),ZE(200000,2),X0(100000),Y0(100000) DIMENSION XI(2000000),YI(2000000),ZI(2000000),A1(100000,4),DZ(100), 1 Z0(100000,2,2),ZU1(30),ZD1(30) REAL*8 PB,QB,Z1,Z2,ZZ0,ZMAX,XX0,YY0 ,P1,P2,P3,XII,YII,A4,A5,A3A REAL*8 Z13,Z24,AB1,AB2,AB3,ZMAX1, DZMIN,DEG,XX,YY,XT0,YT0,ZT0 1 , XT01,YT01,DEG1, ZT01,XSC1,YSC1,DCG1,DZC

C ================================================== READ OPEN FILE NAME
C ------------------------------- READ CONTOROL DATA FROM No.5----------
WRITE (,102)
READ (
,25) FNAME5
C ------------------------------- READ OLD NODE DATA FROM No.8----------
WRITE (,101)
READ (
,25) FNAME6
C--------------------------------------------------- READ OPEN FILE NAME
C
OPEN (5, FILE=FNAME5, STATUS='OLD',FORM='FORMATTED')
OPEN (6, FILE=FNAME6, STATUS='UNKNOWN',FORM='FORMATTED')
OPEN (8, FILE="node-n.dat", STATUS='OLD',FORM='FORMATTED')
C-------------------------------------------------------------------------
cc READ(5, 25) HED
C $$$ ---------------------------------------------------------------
READ(5,) NUMP1,NUME1,NUMP,NEP, NZ, NM
WRITE(6,20) NUMP1,NUME1, NUMP,NEP, NZ, NM
READ(5,
) XT0,YT0,DEG, ZT0
READ(5,) XT01,YT01,DEG1, ZT01
READ(5,
) DZMIN
20 FORMAT(8I9)
C----------------------------
(計算処理部分)
C----------------------------
C
25 FORMAT (A20)
C
102 FORMAT (1H0,'== INPUT DATA FILE NAME [ EX. B:DATA1.DAT ] ====> ')
103 FORMAT (1H0,'== INPUT NODE FILE NAME [ EX. B:DATA2.DAT ] ====> ')
101 FORMAT (1H0,'=== OUTPUT FILE NAME [ EX. C:UNS1.PRN ] ====> ')
C
STOP
END
C

以上です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

自己解決

皆様、私の拙い質問にお付き合いくださりありがとうございました。

otn様のご指摘通り、echoを()でくくり改行させてパイプでつないだところ
プログラムを実行することが出来ました。深く感謝申し上げます。

Z0のソースについてコメントをくださったDaregada様、並びにpepperleaf様にも
感謝申し上げます。

投稿2020/06/18 00:23

編集2020/06/18 00:25
wussy0301

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

それはZ0.exeが出しているメッセージなので、Z0.exeの仕様を知らない他人には対処不能です。

プログラムに変数を引数として渡そうとしているのですが

と書いてあるのに、コードでは引数じゃなくて標準入力に与えようとしていますが、どっちが正しいのでしょう?引数として渡すなら、

CMD

1set PROGRAM=Z0.exe ←プログラム名 2set INPUT=dd.dat ←インプットデータ 3set OUTPUT=a.prn ←アウトプットデータ 4%PROGRAM% %INPUT% %OUTPUT%

です。

#追記
他の人の会頭へのコメントを見ると、引数というのが間違いで、標準入力のようですね。
プログラムが断片的なので、あってるかどうか分かりませんが、1行ずつの入力なので、

CMD

1( 2echo %INPUT% 3echo %OUTPUT% 4) | %PROGRAM%

でしょうか。

投稿2020/06/17 11:10

編集2020/06/17 11:40
otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wussy0301

2020/06/17 11:24

ご回答ありがとうございます。 標準入力と引数がごっちゃになっておりました。 文中の表現に誤解を与えてしまったことをお詫び申し上げます。 記載のコードを参考にさせていただくとともに、使用したプログラムの記載内容を今一度 見直してみたいと思います。
guest

0

ええと、提示されているバッチファイルの内容が実際のものと一致しているか確認してください。
set INUPUT=dd.datってINPUTの打ち間違いですよね。実際にもこうなんでしょうか。

まあ、実際にはINPUTと書いてある前提で次に行きます。
試しに同じバッチファイルを作って、標準入力を読み込んで表示するプログラムを作ったところ、ちゃんとechoで表示した内容がパイプを通じてプログラムに渡されました。

なので、ここには提示されていないZ0.exeの内容に誤りがあります。Z0.exeのソースを提示することをお薦めします。

投稿2020/06/17 11:07

Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wussy0301

2020/06/17 11:24

ご回答ありがとうございます。 質問文中のINUPUTはINPUTのタイプミスです。ご迷惑をおかけしました。 Zo.exeはfortran形式で記述したプログラムで、ファイル読み込み部分は以下の通りです。 ----- C == READ OPEN FILE NAME C ------------------------------- READ CONTOROL DATA FROM No.5---------- WRITE (*,102) READ (*,25) FNAME5 C ------------------------------- READ OLD NODE DATA FROM No.8---------- WRITE (*,101) READ (*,25) FNAME6 C--------------------------------------------------- READ OPEN FILE NAME C OPEN (5, FILE=FNAME5, STATUS='OLD',FORM='FORMATTED') OPEN (6, FILE=FNAME6, STATUS='UNKNOWN',FORM='FORMATTED') 私自身でもソースコードについて、今一度見直してみたいと思います。
Daregada

2020/06/17 11:32

知りたいのは、「FNAME5とFNAME6がどこで設定されているか」ですよ。
pepperleaf

2020/06/17 12:15

> READ (*,25) FNAME5 Fortranは詳しくないですが、ここで、FNAME5 の読み込みでしょうか。 '25'は書式でしょうか? 25文字の意味? とすると文字数が足りないです。(それならば、エラーメッセージの意味が通るが、、、) 質問文にソースを載せ、タグにFortranをいれましょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問