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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

バッチファイル

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

Q&A

2回答

1031閲覧

Windowsバッチ forのコマンド実行について

tnmn

総合スコア5

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

バッチファイル

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

0グッド

0クリップ

投稿2020/05/10 11:53

下記のように記述するとfor内の
「IF EXIST ファイル名~」のコマンドが実行されません。
forの外に出すと正常に実施されます。
どうしたら実行できるかヒントをくださるとうれしいです。

SET valueList=aaaaaaa,bbbbbbb,ddddddd

for %%a in (%valueList%) do (

IF EXIST test.csv SET existFlg=TRUE IF %existFlg%==TRUE ( ECHO ファイルが存在しました。 )

)

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

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

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

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

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

guest

回答2

0

IF %existFlg%==TRUE (%existFlg%の変数展開は、forの実行前に一度だけ行われます。

forの直前のこの変数の値がもし空なら、for文は、

CMD

1for %%a in (aaaaaaa,bbbbbbb,ddddddd) do ( 2 3IF EXIST test.csv SET existFlg=TRUE 4 5IF ==TRUE ( 6ECHO ファイルが存在しました。 7) 8 9)

となって、ifが文法エラーになるはずです。
これだけの処理なら、フラグを設けず、

CMD

1SET valueList=aaaaaaa,bbbbbbb,ddddddd 2for %%a in (%valueList%) do ( 3 IF EXIST test.csv ( 4 ECHO ファイルが存在しました。 5 ) 6)

と書きます。

より複雑な処理で、どうしても変数更新と参照が必要なら、

CMD

1for %%a in (%valueList%) do call :SUB "%%a" 2exit /b 3 4:SUB 5SET existFlg=FALSE 6IF EXIST test.csv SET existFlg=TRUE 7IF %existFlg%==TRUE ( 8 ECHO ファイルが存在しました。 9) 10exit /b

と中身をサブルーチンに切り出すか、遅延環境変数展開というものを使います。

CMD

1setlocal enabledelayedexpansion 2SET valueList=aaaaaaa,bbbbbbb,ddddddd 3for %%a in (%valueList%) do ( 4 SET existFlg=FALSE 5 IF EXIST test.csv SET existFlg=TRUE 6 IF !existFlg!==TRUE ( 7 ECHO ファイルが存在しました。 8 ) 9)

遅延環境変数展開を使うと、それまで普通文字だった!が特殊文字になるので、データの中やファイル名などで!を使っていると駄目です。

#追記
今回だと、比較的影響の少ない変更としては、変数が未定義や空かどうかを調べるif definedを使う方法もあります。

CMD

1SET valueList=aaaaaaa,bbbbbbb,ddddddd 2for %%a in (%valueList%) do ( 3 SET existFlg= 4rem ↑ = の後に空白が入らないように注意 5 IF EXIST test.csv SET existFlg=TRUE 6 IF defined existFlg ( 7 ECHO ファイルが存在しました。 8 ) 9)

投稿2020/05/10 12:07

編集2020/05/10 13:21
otn

総合スコア85901

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

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

tnmn

2020/05/10 12:43 編集

ご丁寧に教えてくださって大変ありがとうございます!!!! そしていくつもの選択肢を、ご提案してくださり大変参考になりました。まずはIF EXIST ファイル〜(コマンド)の方法で実装してみたいと思います。 遅延環境変数など詳しくなかったので勉強になりました。
guest

0

forの中かどうかは関係ありません。
existFlgが空の場合にIF ==TRUE (となりエラーになっているだけです。
空の場合に空白とならないよう"で囲ってやればよいです。

diff

1-IF %existFlg%==TRUE ( 2+IF "%existFlg%"=="TRUE" (

始めに環境変数が展開されることを忘れていました…
otnさんの回答をご参照ください。

投稿2020/05/10 12:06

編集2020/05/10 12:21
SHOMI

総合スコア4079

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

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

tnmn

2020/05/10 12:40

ご回答ありがとうございます!!! 初心者のため、1つ1つとても勉強になります。if分の際はSHOMI様の教えてくださったことも気をつけて記述していこうと思います。参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問