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

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

ただいまの
回答率

88.03%

ファイルをコピーしたい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 370

score 10

前提・実現したいこと

「D:\test\hoge」フォルダにある拡張子が「log」のファイルの中身を「D:\test\hoge\fuga\%S%_%SV_NAME%.log」ファイルにコピーするようなバッチファイルを作成したいです。
拡張子が「log」のファイルは複数あり、それぞれの中身を別ファイルにコピーしたいです。
しかし、以下のエラーが出ており、構文の誤りがどう誤っているかが分からないので、ご教授いただきたいです。
ファイル名は動いてから修正しようと考えているため、遅延評価変数が誤っている可能性がありますが、ご了承ください。

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

コマンドの構文が誤っています。

該当のソースコード(エラーに関係しそうな部分を抜粋)

SET SV_NAME=aaa
FOR /R D:\test\hoge %%i in (*.log) do (
    SET FNAME=%%i
    SET S=!FNAME!:~0,21!
    SET COPY_SRC=D:\test\hoge\!FNAME!
    SET COPY_DST=D:\test\hoge\fuga\%S%_%SV_NAME%.log
    COPY %COPY_SRC% %COPY_DST%
    IF NOT ERRORLEVEL 0 (
        GOTO :ERR1
    )
)
EXIT /B 0

試したこと

FOR文ではなく、ファイル名を直に指定して実行するとしたいように動きました。
FOR文の直前でECHOで文字を出力しようとすると、出力されました。
FOR文の直後(SET FNAMEの直前)で ECHOで文字を出力すると、出力されませんでした。

なので、FOR文が誤っていると考えています。

補足情報(FW/ツールのバージョンなど)

Windows Server2016で動作させたいです。
PowerShellが使用できないため、バッチファイルで作成しています。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

まずは間違いの指摘から。

1.for ~~ ( )内で設定した環境変数の値を参照したいのであれば、遅延環境変数展開を使う必要あり。
⇒ %S% を!S!。他も同様

2.環境変数の部分文字列を取り出す構文が間違っている。
⇒ !FNAME!:~0,21!じゃなくて!FNAME:~0,21!

3.&&iにはフルパスが入る。おそらく環境変数FNAMEにセットしたいのは、D:\test\hoge\foobar.logとかじゃなくてfoobar.logでは?
⇒ SET FNAME=%%iじゃなくてSET FNAME=%%~nxi

4.IF NOT ERRORLEVEL 0は、「ERROELEVELが0以上でなければ」、つまり「負なら」という意味だが、負はあり得ないので、絶対に真にならない
⇒ IF ERRORLEVEL 1 「1以上なら」

少なくともこれだけ間違ってます。

あと、FOR /R D:\test\hogeだと、D:\test\hogeにサブフォルダーがあるとその中を全部見ますが、サブフォルダーは無いですか?
って、fugaがありますね。

おそらく、/rを使わず、cdする方が良いと思われる。

setlocal enabledelayedexpansion

SET SV_NAME=aaa
cd /d D:\test\hoge
FOR %%i in (*.log) do (
    SET FNAME=%%i
    SET S=!FNAME:~0,21!
    SET COPY_SRC=!FNAME!
    SET COPY_DST=fuga\!S!_!SV_NAME!.log
    COPY !COPY_SRC! !COPY_DST!
    IF ERRORLEVEL 1 (
        GOTO :ERR1
    )
)
EXIT /B 0

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/12/22 09:56

    たくさんの指摘をありがとうございました。
    1つずつ修正します。

    キャンセル

0

FOR /R D:\test\hoge %%i in (*.log) do (
%%i の使い方が誤っています。

こちらで実行したら、このようなメッセージ出てますな


ちと実行法が間違ってたようで、
真面目に実行させてみました。
D:\test\hoge には、a.logとb.log をいれてあります
COPYはREMにしてあります

D:\Users\Desktop>SET SV_NAME=aaa

D:\Users\Desktop>FOR /R D:\test\hoge %i in (*.log) do (
SET FNAME=%i
 SET S=!FNAME!:~0,21!
 SET COPY_SRC=D:\test\hoge\!FNAME!
 SET COPY_DST=D:\test\hoge\fuga\!FNAME!:~0,21!_aaa.log
 rem COPY D:\test\hoge\!FNAME! D:\test\hoge\fuga\_aaa.log
 IF NOT ERRORLEVEL 0 (GOTO :ERR1 )
)

D:\Users\Desktop>(
SET FNAME=D:\test\hoge\a.log
 SET S=!FNAME!:~0,21!
 SET COPY_SRC=D:\test\hoge\!FNAME!
 SET COPY_DST=D:\test\hoge\fuga\!FNAME!:~0,21!_aaa.log
 rem COPY D:\test\hoge\!FNAME! D:\test\hoge\fuga\_aaa.log
 IF NOT ERRORLEVEL 0 (GOTO :ERR1 )
)

D:\Users\Desktop>(
SET FNAME=D:\test\hoge\b.log
 SET S=!FNAME!:~0,21!
 SET COPY_SRC=D:\test\hoge\!FNAME!
 SET COPY_DST=D:\test\hoge\fuga\!FNAME!:~0,21!_aaa.log
 rem COPY D:\test\hoge\!FNAME! D:\test\hoge\fuga\_aaa.log
 IF NOT ERRORLEVEL 0 (GOTO :ERR1 )
)


ファイル名の生成のところがタコってるようですね

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

同じタグがついた質問を見る