• 締切済み

バッチファイル

今画像処理のプログラムを作成しています. そのプログラムで,2つの入力画像データを読み込みたいのですが, うまくいきません. 下記のようにプログラムしています. //---------------------- C言語のソース -----------------------// strcpy(Img.FileNameIn1,argv[1]); //InputData1のファイル名の取得 MakeFileName(&Img,"ou1.bmp"); //出力ファイル名の作成 Readbmp(&Img); //InputData1のデータの読み込み strcpy(Img.FileNameIn2,argv[1]); //InputData2のファイル名の取得 MakeFileName(&Img,"out2.bmp");  //出力ファイル名の作成  ReadRaw(&Img); //InputData2のデータの読み込み //------------------------------------------------------------// //------- バッチファイルではこのように書いています ------// @echo off set COMAND = program.exe set PATH = * .bmp set PATH = *_s.bmp echo on for %%A in (%PATH%) do %COMAND% %%A //---------------------------------------------------------// しかし,両方とも,同じ名前の画像を取得してしまいます. 違う画像を取得するにはどのようにプログラムを書いたら よいのでしょうか.アドバイスよろしくお願いします.

みんなの回答

  • kent85
  • ベストアンサー率52% (38/73)
回答No.6

BATとC側の両方ともだと進まないですよ。 ・BATファイルのダブルクリック起動をやめて  DOS窓を開いて、コマンドライン上で BATファイルをタイプして起動する。  ( 結果が見えるため ) ・BATファイルをECHO表示させて確かめる ECHO ON ・BATファイルで for も 変数も使わずにプログラム起動を固定のべた記述する  ( Cのアプリが動くまでは、コマンドラインから起動する場合と全く同じにする ) ・bmp / BAT / Cのアプリは、同じディレクトリに置く ・Cのアプリが動くまでデバッグ  最初は先頭に printf() / MessageBox() で argv[1],argv[2] を表示させるといいかも… ・Cのアプリが動いたら、BATファイルの方を修正する

参考URL:
http://www.ne.jp/asahi/hishidama/home/tech/windows/bat.html
razio915
質問者

お礼

ご回答ありがとうございます

  • Werner
  • ベストアンサー率53% (395/735)
回答No.5

> @echo off > set COMAND=卒業研究プログラム.exe > echo on > for %%A in (%*.raw%) do %COMMAND% %%A.raw %A_s.raw ・COMANDにセットしているのに、読んでいるのは%COMMAND% ・環境変数でもない*.rawを%で囲んでいる ・%A_s.rawの%の数が足りない

razio915
質問者

お礼

バッチファイルの知識がなく、あまりわかっていませんので、 おかしな書き方をしてしまっているかもしれません

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.4

>> strcpy(Img.FileNameIn1,argv[1]); >> strcpy(Img.FileNameIn2,argv[2]); > >上記のように書き直しました.しかし、うまくいきませんでした. うまくいかない状況は?

razio915
質問者

補足

バッチファイルをダブルクリックしても、処理が実行されずに, すぐに終了してしまいます

  • Werner
  • ベストアンサー率53% (395/735)
回答No.3

環境変数PATHは特別な意味を持つので 一時変数として使わない方がよいです。 > @echo off > set COMAND=program.exe > echo on > for %%A in (%PATH%) do %COMAND% %%A.bmp %%A_s.bmp %PATH%のところを適切に書き換えないとだめでしょう。(たとえば*.bmpとか) > strcpy(Img.FileNameIn1,argv[1]); > strcpy(Img.FileNameIn2,argv[1]); > ここのargvも変えないといけないのですよね? 当然。 あとは、COMMANDじゃなくてCOMANDなのが気になる。

razio915
質問者

補足

@echo off set COMAND=卒業研究プログラム.exe echo on for %%A in (%*.raw%) do %COMMAND% %%A.raw %A_s.raw > strcpy(Img.FileNameIn1,argv[1]); > strcpy(Img.FileNameIn2,argv[2]); 上記のように書き直しました.しかし、うまくいきませんでした.

  • Cupper
  • ベストアンサー率32% (2123/6444)
回答No.2

C言語で書いたプログラムの方は良く分かりませんが、バッチファイルは @echo off > nul set COMAND = program.exe echo on %COMAND% %%A.bmp %%A_s.bmp または program.exe %%A.bmp %%A_s.bmp ではダメですか edomin2004さんが回答しているように質問の例では PATHを上書きしているので、 *_s.bmp だけが PATHになっています また、プログラムに対してパラメータを与えるときはプログラムを2回起動するのではなく  PROGRAM <PARAMETER1> <PARAMETER2> として与えるのが普通です 質問にあるバッチファイルの例では  program.exe %%A.bmp  program.exe %%A_s.bmp として2回起動しようとしています (幸い PATHが *_s.bmpだけなので1回しか起動されていない) これが edomin2004さんの仰る >どちらも「argv[1]」にアクセスしている。 に掛かっていると思います

razio915
質問者

補足

@echo off set COMAND=program.exe echo on for %%A in (%PATH%) do %COMAND% %%A.bmp %%A_s.bmp としてもダメでした. strcpy(Img.FileNameIn1,argv[1]); strcpy(Img.FileNameIn2,argv[1]); ここのargvも変えないといけないのですよね?

noname#77845
noname#77845
回答No.1

気がついたところ。 1 ファイルにアクセスするときに、どちらも「argv[1]」にアクセスしている。(当然同じファイル。) 2 バッチファイルの中で「PATH」(最初は「*.bmp」)を上書き(「*_s.bmp」へ)している。(上書きしているので、「PATH」は「*_s.bmp」) 3 ファイル名が「aaa.bmp」と「aaa_s.bmp」を「*.bmp」なら両方取得してしまう。(今の場合は関係ないか…。) 因みに、環境変数「PATH」は変更しない方が良いと思いますよ。

razio915
質問者

お礼

ありがとうございます. このプログラムをどのように変えていけばよいのでしょうか?

関連するQ&A

  • バッチファイルの質問です。

    バッチファイルの質問です。 作成しているのですが、最後のif "%BASE_PATH%" == "" ( がどうしても通りません。 表記がおかしいんでしょうか? また別のいい方法があれば教えてください。 rem ************************************************** rem 処理名 :送受信ファイル削除 rem 処理概要 :送受信フォルダのファイルを削除する rem ファイル名 :FILE_DELETE.bat rem 引数 :(1)ファイルID[12文字] (2)データ区分[S:送信、R:受信] rem 戻り値 :正常:0、異常:2 rem ************************************************** rem **** 初期処理 **** set SCRIPT_NAME=FILE_DELETE set TMP_HR=%time: =0% set "DATE_STR=%date:~0,4%%date:~5,2%%date:~8,2%%TMP_HR:~0,2%%time:~3,2%%time:~6,2%%time:~9.2%" set RETCODE=0 set ROOT_P= set ROOT_P=D:\HOME\If set LOG_PATH=D:\HOME\Log set LOG_NAME=%SCRIPT_NAME%_%1.log set BASE_PATH="" rem **** 処理ベースのPATH設定 **** set ARGV1=%1 set AITE_DIR=!ARGV1:~0,2! if "%AITE_DIR%" == "ST" ( set BASE_PATH=%ROOT_P%\ST010 ) if "!ARGV1:~0,5!" == "LE70S" ( set BASE_PATH=%ROOT_P%\LE020 ) rem **** ベースPATHの設定失敗 **** if "%BASE_PATH%" == "" ( echo %DATE% %TIME% %COMPUTERNAME%:ERR-00204 ベースPATHがありません >> "%LOG_PATH%\%LOG_NAME%"

  • バッチファイル内のパスについて

    バッチファイルのパスについて質問があります。 下記内容のファイルを実行すると、  「C:\Programが見つかりません」 というようなエラーとなってしまいます。 setコマンド時には、スペースの入ったパスはエラーとなってしまうのでしょうか? どなたがご教授ください。お願いします。 @echo off set JAVA_HOME=C:\Program Files\JavaSoft\JRE\1.3.1_12

  • バッチファイルがうまくいきません。

    %1が空でなかった場合、その値を変数motoに入れて、 空だったら"123.bmp"の値を変数に入れたいのですが。 うまくいきません。 わかる方がいらっしゃいましたら教えていただけないでしょうか、 よろしくお願いいたします。 ================ REM 画像名を取得 set moto="" if not "%1"=="" %moto%= %1 else %moto%=123.bmp ===============

  • バッチファイルでの%を含むファイル名の取得

    以下はEドライブを走査してフォルダごとのjpgやpngなどのファイルの数を全て表示するバッチ処理ですが。基本的に上手く動きますが%を含むファイル名、フォルダ名に当たると上手く動きません。どうしたらいいでしょうか?”ファイル名、フォルダ名に%を使うな”という回答以外でお願いします。 @echo off pushd E:\ for /f "delims=" %%j in ('dir /b /s /a:d') do call :sub "%%j" exit /b :sub echo /////////////////////////////////////////////////////////////////////////// for /f "delims=" %%x in ('dir /b %1 ^| find /c ".jpg"') do call :jpg %%x for /f "delims=" %%x in ('dir /b %1 ^| find /c ".JPG"') do call :jpg2 %%x for /f "delims=" %%x in ('dir /b %1 ^| find /c ".png"') do call :png %%x for /f "delims=" %%x in ('dir /b %1 ^| find /c ".bmp"') do call :bmp %%x echo %1 echo jpg %jpg_c% echo png %png_c% echo bmp %bmp_c% echo JPG %jpg2_c% goto :EOF :jpg set jpg_c=%1 :echo %1 goto:EOF :jpg2 set jpg2_c=%1 :echo %1 goto:EOF :png set png_c=%1 :echo %1 goto:EOF :bmp set bmp_c=%1 :echo %1 goto:EOF :all set all_c=%1 :echo %1 goto:EOF

  • バッチファイルで画像ファイル名の頭文字を削除したい

    一括で、画像のファイル名の頭4文字を削除したいと思っています。 拡張子はJPGで、バッチで作成しています。 ほぼ、うまく動いているのですが、 1つ目の画像ファイルだけが、8文字削除されてしまいます。 どこが間違えているのかが分からなくて、 ご教授いただけますでしょうか。 よろしくお願いいたします。 @echo off setlocal enabledelayedexpansion for %%F in (*.jpg *.png *.gif *.bmp) do ( set "filename=%%~nF" set "extension=%%~xF" rem ファイル名が4文字以上の場合にのみ先頭4文字を削除 if "!filename:~4!" neq "" ( set "tempname=!filename:~4!!extension!" rem ファイル名が元の名前と異なる場合のみリネーム if not "!tempname!"=="%%F" ( ren "%%F" "!tempname!" ) ) else ( echo ファイル名が短すぎて変更できません: "%%F" ) ) endlocal

  • バッチファイルで悩んでいます。

    プログラミング初心者です。 御教授の程、宜しくお願いします。 以下のプログラムは 1.ユーザーからフォルダをドラッグ・アンド・ドロップしてもらう。 2.ユーザーに日付を入力してもらう(yyyymmdd方式) 3.ユーザーに下記の2つから選んでもらう。   1.入力した日付よりも前に更新されたファイルを表示   2.入力した日付よりも後に更新されたファイルを表示 4.ユーザーから受け付けた条件で、サブフォルダも含めて   コマンドプロンプト上に    更新日時 ファイルへのパス   を表示する。 ------------------------------------------- list.bat echo off set /P YYYYMMDD=日付を入力してください(YYYYMMDD): :loop echo ---------------------------------------------------- echo 入力した日付よりも前に更新されたファイルを表示 - [1] echo 入力した日付よりも後に更新されたファイルを表示 - [2] echo ---------------------------------------------------- set /P chk= 1 か 2 を入力してください: if not defined chk goto loop if %chk% EQU 1 set op=LSS&goto listup if %chk% EQU 2 set op=GTR&goto listup goto loop :listup echo. for /R %1 %%F in ( *.* ) do call :sub "%%~fnxF" %%~tF cmd /k :sub set fdate=%2 set fdate=%fdate:/=% if %fdate% %op% %YYYYMMDD% echo %2 %3 %1 goto :EOF このプログラムに関しまして、 4.ユーザーから受け付けた条件で、サブフォルダも含めて   コマンドプロンプト上に    更新日時 ファイルへのパス   を表示する。 をコマンドプロンプト上にではなく、エクセルファイル上に変更したいです。 教えて頂きますと助かります。 それでは、宜しくお願い致します。

  • ファイルドラッグ起動時のデフォルトパス

    C++でプログラミングをしている物ですが、 プログラム内でファイル名を指定するとき「Data/img.bmp」のように指定できるのですが、 このプログラムの実行ファイルにほかのファイルをドラッグして実行した場合、上のファイル名の指定の仕方だとエラーが出てしまいます。 それは実行ファイルのデフォルトのパスが変わってしまうのだとか・・・ で、ファイルを読み込むときにアプリケーションのパスを取得する関数などを呼び出してフルパスで指定することもできるのですが、読み込むファイルの量が膨大で、すべてにその処理をしていると時間がかかってしょうがありません。 そこで、アプリケーションのデフォルトのパスをプログラムで変える方法を探しているのですが見つかりません。 解決法を探しています。どなたかよろしくお願いします。

  • バッチファイルについて

    @cmd /k 上記の内容で「a.bat」というファイル名で保存しました。 この保存したファイルをダブルクリックすると、バッチファイルが格納されてるフォルダのパスがコマンドプロンプト上に表示されます。 パス表示後に、いろいろな動作(「echo~」など)を実行したいと思っているんですが、うまくいきません。 どうやら一番上の「@~」を記述したものは、そのあとに「echo~」などを記述しても実行してくれないみたいです。 「@cmd /k」実行後に何か(「echo~」など)を実行するにはどうしたらいいですか?

  • 次のプログラムを簡単にしたいです。

       std::vector< string > img_file(m); img_file[0] = "image1.bmp"; ///< 画像ファイル名 img_file[1] = "image2.bmp"; ///< 画像ファイル名 img_file[2] = "image3.bmp"; ///< 画像ファイル名 img_file[3] = "image4.bmp"; ///< 画像ファイル名 img_file[4] = "image5.bmp"; ///< 画像ファイル名 img_file[5] = "image6.bmp"; ///< 画像ファイル名 img_file[6] = "image7.bmp"; ///< 画像ファイル名 img_file[7] = "image8.bmp"; ///< 画像ファイル名 img_file[8] = "image9.bmp"; ///< 画像ファイル名 img_file[9] = "image10.bmp"; ///< 画像ファイル名 img_file[10] = "image11.bmp"; ///< 画像ファイル名 img_file[11] = "image12.bmp"; ///< 画像ファイル名 img_file[12] = "image13.bmp"; ///< 画像ファイル名              ・              ・              ・              ・ img_file[99] = "image100.bmp"; ///< 画像ファイル名 /// 画像読み込み if( !mist::read_bmp( image, img_file[i] ) ){///この部分でファイル名の画像を読み込み cerr << "Could not read file: " << img_file[i] << endl; exit(1); } のように画像を入力して、プログラムを回しています。 これからimageを200や300まで増やしたいと思っています。このままだと画像ファイル名を200行、300行書かなくてはならないので、なんとかforループや他のdatファイルから画像を読み込みたいのですが、何かいい方法はないでしょうか?

  • フォルダごとのファイル数を数えるためのバッチ

    フォルダごとのファイル数を数えるためのバッチをネットで調べて作成しました。 このバッチファイルを親フォルダ直下に配置し、ダブルクリックで実行しています。 ------------------------------------------------------------------------- @echo off setlocal enabledelayedexpansion set /a counter=0 dir %1 /ad /s /b >trash.csv for /f "tokens=1 delims=," %%i in (trash.csv) do ( set /a counter = 0 for %%A in (%%i\*) do ( if exist %%A ( set /a counter=counter+1 ) ) echo %%i : !counter! ) ------------------------------------------------------------------------- しかし、結果は、フォルダ名は取得していますが、ファイル数が取得できていません。 こんな感じです。 setlocal コマンドに無効なパラメータが指定されました d:\画像\フォルダ1 = 0 d:\画像\フォルダ2 = 0 d:\画像\フォルダ1\フォルダ3 = 0 どたなかどこが間違っているのかご指摘ください。

専門家に質問してみよう