変数値を設定し、後で同じ括弧で囲まれたコードブロック内の値にアクセスしているため、ファイルが既に存在する場合、コードは失敗します。%uses%
行が解析されるときに展開され、コードブロック全体が一度に解析されます。したがって、エコーしている値は、FORループが実行される前に存在していた値であり、必要な値ではありません。
を使用して遅延拡張を有効にし、の代わりにを使用することで、問題を解決setlocal enableDelayedExpansion
でき!uses!
ます%uses%
。詳細については、コマンドプロンプトhelp set
から入力してください。ヘルプの約半分で、「最後に、遅延環境変数拡張のサポートが追加されました...」で始まる段落から読み始めてください。
ただし、拡張を遅らせる必要がない、より簡単な方法があります。IFブロック内で値を設定するだけで済みます。後でIFブロックの外でアクセスできます。
現在回避しているもう1つの問題がありますが、注意する必要が1>filename
あり>filename
ます。同じことを実行します。これらは、標準出力(stdout)をファイルにリダイレクトするための命令です。1はstdoutのIDであり、番号が明示的に指定されていない場合のデフォルトです。2>filename
標準エラー(stderr)をファイルにリダイレクトします。番号と。の間にスペースがあるため、番号をストリームIDとして解釈することは避けています>
。しかし、注意しないと、いつかスペースがなくなり、番号が印刷されない理由について混乱するでしょう。リダイレクトを最後ではなく前に配置することで、問題を回避できます。>filename echo %uses%
したがって、これが完全に機能するソリューションです。
@echo off
setlocal
if not exist statistic_files mkdir statistic_files
cd statistic_files
set "file=%username%-use_tracking"
set "uses=1"
if exist %file% for /f %%G IN (%file%) do set /A uses=%%G+1
>%file% echo %uses%