式の結果を変数に設定する方法

式の結果を変数に設定する方法

ファイルの日付を抽出し、この文字列を新しいファイルの名前の一部として使用する必要があります。次のコマンドを使用してこれを解決しようとしました。

まず、ファイルの詳細を取得し、出力を一時ファイルにリダイレクトします。

DIR c:/myfolder/thefile.txt >> tmp.txt

次に、FINDSTR を使用して日付を含む行を取得します。日付のみを取得する方法が存在する場合は、それを見つけられませんでした。

FINDSTR [0-9]*\/[0-9]*\/[0-9] tmp.txt

出力は次のようになります。

10/04/2012 07:55 66,029 thefile.txt

ここで、この結果を変数に設定します。

SET vartmp=FINDSTR [0-9]*\/[0-9]*\/[0-9] tmp.txt

%vartmp% を入力すると次の結果が返されるので、うまくいったようです。

10/04/2012 07:55 66,029 thefile.txt

しかし、vartmp の一部を抽出しようとすると、問題が発生し始めます。

ECHO %vartmp:~0,2%

「10」を期待していたのに、文字列「FI」が返されます。vartmp は式を保存していて、式の結果を保存していないようです。式の結果を別の tempvar に割り当てて、tempvar の部分文字列を抽出しようとしていますが、何も変わりません。

答え1

FOR コマンドを使用すると、行をトークンに分割して、必要な部分だけを取得できます。/f を使用すると、他のコマンドの出力 (この場合は、FIND でフィルターされた DIR の出力) に対して実行できます。

for /f "tokens=1" %%a in ('dir thefile.txt ^| Find "thefile.txt"') do (
set vartmp=%%a
)

答え2

理想的ではないが、変更できる可能性がSET vartmp=FINDSTR [0-9]*\/[0-9]*\/[0-9] tmp.txtある

FINDSTR [0-9]*\/[0-9]*\/[0-9] tmp.txt > tmp2.txt
SET /p vartmp =< tmp2.txt
DEL tmp2.txt

答え3

あなたの例に従うと、次の行を置き換えても同じ結果が得られました:

SET vartmp=FINDSTR [0-9]*\/[0-9]*\/[0-9] tmp.txt

for /f %i in ('FINDSTR [0-9]*\/[0-9]*\/[0-9] tmp.txt') do set vartmp=%i

すると、vartmp はあなたが探しているものを保持します。ここでは一重引用符が必要で、二重引用符は機能しないことに注意してください。また、バッチファイルで使用する場合は、%i の代わりに %%i が必要です。

関連情報