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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

282閲覧

遅延環境変数を引数とする方法がわからない

sedrft

総合スコア0

バッチファイル

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2024/04/21 08:22

実現したいこと

windowsバッチで、csvのリストファイルの値に応じて変化させた変数をpythonを呼ぶ際の引数として渡したい。

前提

発生している問題・エラーメッセージ

windowsバッチからpytonを呼び出す際に遅延環境変数を引数として渡すときに、うまく引数が渡されません。
下記のソースのように呼び出し先で引数を表示させるだけでしたら正常に値を表示してくれますが、実際に行いたいpythonのスクリプトは与えられた引数をもとにAzureのBlobストレージへ対象のフォルダ・ファイルをアップロードするというもので、!で囲まれた変数名をそのまま引数として渡しているように見えます。(業務に関するものなので詳細には記載できません)

コマンドプロンプト上では↓のように表示されているのですが、「python test2.py !変数1! !変数2! !変数3! 言語」の行で変数が!で囲まれたまま別のバッチ等を呼ぶのは正常な動作なのでしょうか?

C:\Users\batche>( if b == a ( set 変数1=アメリカ_2024/04/21 set 変数2="こんにちは" set 変数3="こんばんは" ) else if b == b ( set 変数1=アメリカ_2024/04/21 set 変数2="hello" set 変数3="Good evening" ) python test2.py !変数1! !変数2! !変数3! 言語 ) test2.py アメリカ_2024/04/21 hello Good evening 言語

該当のソースコード

list.txt

1a,日本 2b,アメリカ

test.bat

1setlocal enabledelayedexpansion 2for /f "tokens=1-2 delims=," %%i in (list.txt) do ( 3 if %%i==a ( 4 set 変数1=%%j_%date% 5 set 変数2="こんにちは" 6 set 変数3="こんばんは" 7 ) else if %%i==b ( 8 set 変数1=%%j_%date% 9 set 変数2="hello" 10 set 変数3="Good evening" 11 ) 12 13 python test2.py !変数1! !変数2! !変数3! %変数4% 14) 15endlocal

test2.py

1import sys 2 3if __name__ == "__main__": 4 param = sys.argv 5 for p in param: 6 print(p)

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

meg_

2024/04/21 08:46

> !で囲まれた変数名をそのまま引数として渡しているように見えます。 そう思ったのは何故ですか?それを推測できるエラーメッセージ等があったのでしょうか?
TakaiY

2024/04/21 09:02

> コマンドプロンプト上では↓のように表示されているのですが、「python test2.py !変数1! !変数2! !変数3! 言語」の行で変数が!で囲まれたまま別のバッチ等を呼ぶのは正常な動作なのでしょうか? コマンドの実行結果にも問題があるようには見えないし、上の質問の「正常な動作なのでしょうか」で問われている動作がどういう動作を指しているのかもわかりません。 「xxxのようになるはずだと思っているのにyyyとなっている」というように、具体的に説明いただけますか。
guest

回答1

0

勘違いでしょうね。

「python test2.py !変数1! !変数2! !変数3! 言語」の行で変数が!で囲まれたまま別のバッチ等を呼ぶのは正常な動作なのでしょうか?

コマンドのエコー表示は、構文解析時の物なので、変数の値は取り出す前の表示です。
CMD.EXEがコマンドを起動する際に展開されます。
%による変数展開は、Cで言うマクロ展開みたいな物なので、まず展開してから構文解析されるので、展開後がエコー表示されますが。

実際に実行されるコマンドラインを見たい時は、自分でechoします。

CMD

1 echo python test2.py !変数1! !変数2! !変数3! %変数4% 2 python test2.py !変数1! !変数2! !変数3! %変数4%

結果を見れば、展開後にコマンドが起動されていることが分かると思います。
つまりPythonスクリプト内の問題です。現象が書かれてないので、これ以上は言い様がないですが。

例えば、引数引き渡し時点の間違い例としては、

CMD

1setlocal enabledelayedexpansion 2set ARG1=aa bb 3set ARG2=cc 4set ARG3=dd 5python test2.py !ARG1! !ARG2! !ARG3!

だと、sys.argv["aa","bb","cc","dd"]ですが、["aa bb","cc","dd"]だと勘違いしているとか。
この場合だとバッチ側の間違いで、python test2.py "!ARG1!" "!ARG2!" "!ARG3!"ですね。

参考:
%による展開→構文解析→エコー表示→!による展開→実行と分かる例:

CMD

1setlocal enabledelayedexpansion 2set AAAAA=if 1==1 date/t 3 4@echo AAAAA の値は "%AAAAA%" 5@echo AAAAA の値は "!AAAAA!" 6 7%AAAAA% 8!AAAAA!

最後がエラーになるのはif等の構造を持った文の構文解析を、!による展開後に再度行わないため。

投稿2024/04/21 10:55

otn

総合スコア85637

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.39%

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

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

質問する

関連した質問