バッチスクリプトをPythonに変換しています。私はここに捕まってしまった:私はバッチ感嘆符のマーク変数
set "FILENAME=!FILENAME! %%x"
が何をするのか理解していない
setlocal EnableDelayedExpansion
for /F %%x in ('dir /B/D %OPATH%') do (
set "FILENAME=!FILENAME! %%x"
)
。
バッチスクリプトをPythonに変換しています。私はここに捕まってしまった:私はバッチ感嘆符のマーク変数
set "FILENAME=!FILENAME! %%x"
が何をするのか理解していない
setlocal EnableDelayedExpansion
for /F %%x in ('dir /B/D %OPATH%') do (
set "FILENAME=!FILENAME! %%x"
)
。
通常、%var%
はvar
の値を取得します。
それに起因して変化するようにcode block
(行の括弧のシリーズ)の範囲内、%var%
ブロックを呼び出すステートメント(for
又はif
)が発生したvar
の値ではなく、var
の値に置き換えられますブロックの操作(run-time
値)。
delayedexpansion
が呼び出されると、%var%
はまだ元、parse-time
値を返すが、この場合には、filename
ループが進むにつれて、それに添付%%x
の各値を有するので、run-time
値を!var!
返します。 (注意:バッチ変数に〜8180文字の制限があります(実際には、可変長の8191-length))
forループは、見つかったすべてのdirエントリを1つの文字列に連結します。
BTW Dirの/ Bが/ Dを上書きするため、省略することができます。
また、/ fオプション"tokens=1 delims= "
の既定値は、ファイル名をスペースで切り捨てます。
Magooは他の問題についてもうまく説明しました。
バッチスクリプトは、OPATHディレクトリのファイル名のスペースで区切られたリストを生成しています。リストと同じものを得るには、Python glob
を使用すれば十分です。
import os
import glob
dlist = glob.glob(os.environ['OPATH'] + os.sep + '*')
これにより、ファイル名のリストが生成されます。ディレクトリ名の末尾にos.sepが付きます。これは、スペース区切り文字を含む単一の文字列よりも、Pythonコードが処理する方が簡単かもしれません。
スペースで区切られた文字列が必要な場合は、簡単に結合できます。
dstring = ' '.join(dlist)