2017-09-03 14 views
1

バッチスクリプトをPythonに変換しています。私はここに捕まってしまった:私はバッチ感嘆符のマーク変数

set "FILENAME=!FILENAME! %%x" 

が何をするのか理解していない

setlocal EnableDelayedExpansion 

for /F %%x in ('dir /B/D %OPATH%') do (
    set "FILENAME=!FILENAME! %%x" 
) 

答えて

4

通常、%var%varの値を取得します。

それに起因して変化するようにcode block(行の括弧のシリーズ)の範囲内、%var%ブロックを呼び出すステートメント(for又はif)が発生したvarの値ではなく、varの値に置き換えられますブロックの操作(run-time値)。

delayedexpansionが呼び出されると、%var%はまだ元、parse-time値を返すが、この場合には、filenameループが進むにつれて、それに添付%%xの各値を有するので、run-time値を!var!返します。 (注意:バッチ変数に〜8180文字の制限があります(実際には、可変長の8191-length))

2

forループは、見つかったすべてのdirエントリを1つの文字列に連結します。

BTW Dirの/ Bが/ Dを上書きするため、省略することができます。

また、/ fオプション"tokens=1 delims= "の既定値は、ファイル名をスペースで切り捨てます。

Magooは他の問題についてもうまく説明しました。

1

バッチスクリプトは、OPATHディレクトリのファイル名のスペースで区切られたリストを生成しています。リストと同じものを得るには、Python globを使用すれば十分です。

import os 
import glob 
dlist = glob.glob(os.environ['OPATH'] + os.sep + '*') 

これにより、ファイル名のリストが生成されます。ディレクトリ名の末尾にos.sepが付きます。これは、スペース区切り文字を含む単一の文字列よりも、Pythonコードが処理する方が簡単かもしれません。

スペースで区切られた文字列が必要な場合は、簡単に結合できます。

dstring = ' '.join(dlist) 
関連する問題