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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Windows Server

Windows Serverとは、Microsoft社のサーバ用オペレーティングシステムの総称です。 企業内ネットワークなどで利用されるサーバ機へ導入することを想定して開発されているため高い安定性があり、 管理機能を提供するソフトウェアが多く含まれています。

Q&A

解決済

1回答

3223閲覧

forコマンドで抜き出したトークンをファイル名に使う方法

oftn

総合スコア19

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Windows Server

Windows Serverとは、Microsoft社のサーバ用オペレーティングシステムの総称です。 企業内ネットワークなどで利用されるサーバ機へ導入することを想定して開発されているため高い安定性があり、 管理機能を提供するソフトウェアが多く含まれています。

0グッド

0クリップ

投稿2019/02/27 13:56

編集2019/02/28 01:15

前提・実現したいこと

今robocopyでのファイル同期を実行した際、
外部のテキストフォルダからforコマンドで特定の列のトークンを抜き出して、
ログファイル名をつけようとしています。
ですが、トークンが抜き出せず、ログファイル名が正しく表示されません。
どなたか解決方法をご存知でしたら、教えてください。

バッチ自体は、複数ある同期対象ファイルを、外部テキストファイルから取り出してループすることで、一つのバッチで同期を完了させようとしています。
ただログについては、一つのログだと複数のファイルがログに書き込む時間が重なり、問題が発生しそうなため、ログファイルは同期対象ファイルごとに毎日ログローテーションさせようとしています。

どうか力を貸してください。

発生している問題・エラーメッセージ

下のソースコードを実行してコマンドプロンプトにechoを出力すると、 echo 同期元ディレクトリ1 echo 同期先ディレクトリ1 echo ファイル名1 echo c:\work\yyyymmdd_backup_.log となり、backup_の後ろに%%cの内容であるファイル名1が入らない

該当のソースコード

rem 実行しているバッチ

rem @echo off

for /f "tokens=1,2,3" %%a in do (
set logfile=c:\work%date:~0,4%-%date:~5,2%-%date:~8,2%backup%%c.log
rem 上の%%cに外部テキストファイルから、トークンを入れようとしています。
start /min robocopy %%a %%b /MIR /R:0 /W:0 /NP /NDL /XJD /XJF /LOG+:%logfile%
echo %%a
echo %%b
echo %%c
echo %logfile%


外部テキストファイル

同期元ディレクトリ1 同期先ディレクトリ1 ファイル名1
同期元ディレクトリ2 同期先ディレクトリ2 ファイル名2
同期元ディレクトリ3 同期先ディレクトリ3 ファイル名3
……

試したこと

%%cの部分を、
%c%
%%%c%
ともしましたが、入りませんでした。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

forで回す対象の要素がないのと、ブロックを閉じる)がないのは、コピペ漏れでしょうからスルーします。

バッチファイルは、変数の内容が展開されてからブロックが実行されるため、ブロック内で内容の変化する変数を扱う場合は、遅延展開を有効にして変数を%ではなく!で参照するか、変数への代入でcallを使う必要があります。

必要部分だけ

BAT

1rem 遅延展開 2setloocal enabledelayedexpansion 3 4start /min robocopy %%a %%b /MIR /R:0 /W:0 /NP /NDL /XJD /XJF /LOG+:"!logfile!" 5echo !logfile!

BAT

1rem call 2call set logfile=c:\work\%date:~0,4%-%date:~5,2%-%date:~8,2%_backup_%%c.log

投稿2019/02/27 15:55

編集2019/02/28 00:49
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

oftn

2019/02/28 00:32

丁寧に解説ありがとうございます。 1点質問なのですが、バッチ内なのに、%logfile%ではなく、!logfile!のように、!で囲う意味は何なのでしょうか? 今こちらを実行してみているのですが、logfileの値がうまくとれず・・・・
退会済みユーザー

退会済みユーザー

2019/02/28 00:55

回答文の編集ミスがあり意味不明なところがありました。 スマホ打ちなので詳細は割愛しますが、!での参照は遅延展開させるためです。その先の説明はヘルプなり検索などでお願いします。 また、解りにくかったかもしれませんが、今回のコードなら遅延展開を使わず、callを使う方が楽だとは思います。
oftn

2019/02/28 01:40

解決できました!ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問