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

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

ただいまの
回答率

90.03%

バッチ 遅延環境変数について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,618

pipi

score 181

遅延環境変数について学習しているのですが、
実際に、下記のコードでは、どこにsetlocal enabledelayedexpansion endlocalを
入れるべきか・・・

.datファイルをコピーしてコピーに要する時間を計測するバッチ↓

@echo off

for %%i in (*.dat) do call :sub %%i
echo.
exit /b

:sub
set src=C:\work\01_学習資料\01_Windows\01_bat\%1
set dst=C:\work\01_学習資料\01_Windows\01_bat\tmp\
set Log-path=C:\work\01_学習資料\01_Windows\01_bat\tmp\

set S_time=%time: =0%
set hh=%S_time:~0,2%
set mi=%S_time:~3,2%
set ss=%S_time:~6,2%
set sss=%S_time:~9,2%
set S_datatime=%hh%%mi%%ss%

echo PC→Server > %Log-path%cp-%1-%S_datatime%.log
echo CopyFileName: %1 >> %Log-path%cp-%1-%S_datatime%.log
echo 開始時刻: %S_datatime% >> %Log-path%cp-%1-%S_datatime%.log

copy %src% %dst%

set E_time=%time: =0%
set hh=%S_time:~0,2%
set mi=%S_time:~3,2%
set ss=%S_time:~6,2%
set sss=%S_time:~9,2%
set E_datatime=%hh%%mi%%ss%


echo 終了時刻: %E_datatime% >> %Log-path%cp-%1-%E_datatime%.log


timeout /T 2 > null


で、実際、遅延環境変数を使うとしたら上記コードの場合
for文の前でしょうか??

setlocal enabledelayedexpansion
for %%i in (*.dat) do call :sub %%i
echo.
endlocal
exit /b
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

遅延環境変数を使っていませんので、setlocal enabledelayedexpansionはどこにも入れる必要はありません。

遅延環境変数というのは、環境変数の値の参照を、%変数名%ではなく!変数名!で行う記法です。
こう書くと、変数の展開が、個々の文の実行直前まで遅延されることになります。

よく使われるのはこういうケースです。forif()のような複合文の中。

setlocal enabledelayedexpansion
set X=
for %%A in (a b c d) do set X=!X! %%A
echo %X%

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/22 22:04 編集

    >遅延環境変数を使っていませんので

    ということは、私の質問の仕方が悪かったですね。
    上記コードは、遅延環境変数を使う必要がありますか、ありませんか?という質問の仕方の方がよかったですね。

    上記コードを実行すると、順番にコピーされない状態なのです。。。

    以下の様にしたら1つ1つ順番にコピーできている感じです。
    setlocal enabledelayedexpansion
    copy !src! !dst!
    endlocal

    キャンセル

  • 2018/11/22 22:10

    期待する処理結果と、実際に実行した場合の処理結果を、否定文を使わずに書いてください。

    キャンセル

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

  • ただいまの回答率 90.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる