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

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

ただいまの
回答率

89.12%

batファイルで、先頭や末尾以外に文字を追加したい

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 4,012

arimura

score 8

大量のファイル名に文字を追加したいと考えております。

文字列の先頭や末尾では無く、拡張子を除いて末尾から三番目以前に文字(_hoge)を追加したいのです。
以下は末尾に入れるコードなのですが、

@echo off

rem 実行バッチファイル名を取得
set add=%~n0

for %%i in (*) do (
    rem 実行バッチファイル自身以外に実行
    if not %%i==%~n0%~x0 (
        rem ファイル名の末尾に追記
        ren %%i %%~ni_%add%%%~xi
    )
)

pause

例:
abc_01.jpg
abcdef_01.jpg
hogehoge_01.jpg

を、下記のように
abc_hoge_01.jpg
abcdef_hoge_01.jpg
hogehoge_hoge_01.jpg

とするにはどのように書き替えたら良いでしょうか?
お力を貸して下さい。

宜しくお願い致します。 

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

checkベストアンサー

+2

@echo off
set add=%~n0
for %%i in (*) do (
    if not %%i==%~nx0 (
        call :rename %%i
    )
)
pause
goto :EOF

:rename
set A=%~n1
ren %1 %A:~0,-3%_%add%%A:~-3%%~x1
goto :EOF

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/10/01 23:05 編集

    > goto :EOFがなくとも終わりますが、
    はい。自分で使うときは書きません。
    相手が、後ろにコードを継ぎ足したときに、あれ?と思わないように、こういう場では書いています。

    > callされた処理での終端は exit /b 付与がスタンダードと思います。
    好みでは?私は、リターンコードを返すときだけexit /bを使っています。
    常にexit /bを使えば、goto :EOFという機能は不要なので、そういう方針も賛成です。

    キャンセル

  • 2018/10/01 23:20

    好みと言われればそれまでかも知れません。
    メインルーチンのラストのみgoto :EOF
    サブルーチンラストはexit /b とする規約で可読性と分割時の移植性や拡張性を担保しておりました。
    書き捨てコードならどうでもいい話かと思います

    キャンセル

  • 2018/10/01 23:26

    exit /bで統一というのなら分かりますが、その使い分けは分からない。気分の問題でしょうか。

    キャンセル

+1

「_01.jpg」の文字数が固定(7文字)の場合に限る。

@echo off
setlocal enabledelayedexpansion

for %%f in ("*.jpg") do (
   set STR=%%f
   echo !STR:~0,-7!_hoge!STR:~-7!
)


参考:BATファイルで文字列の切り出し

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/10/01 22:07

    感謝してます。早々と本当にありがとうございました。

    キャンセル

+1

%%iを一旦別の変数に格納し、更に遅延環境変数にする必要があります。
遅延環境変数は先頭でsetlocalをするのと、ループ内では!で囲みます。

@echo off
setlocal enabledelayedexpansion

rem 実行バッチファイル名を取得
set add=%~n0

for %%i in (*) do (
    rem 実行バッチファイル自身以外に実行
    if not %%i==%~n0%~x0 (
        rem ファイル名の末尾に追記
        set str=%%i
        echo %%i !str:~0,-7!_hoge!str:~-7!
    )
)

pause

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/10/01 22:07

    感謝してます。早々と本当にありがとうございました。

    キャンセル

+1

@echo off
rem for文ループ内で変数へ代入しその後値参照するため遅延変数展開を用いる
setlocal enabledelayedexpansion
for %%i in (*) do (
    rem 実行バッチファイル自身は除外
    if not "%%i"=="%~nx0" (
        rem %%iのファイル名部文字列を変数fnに代入
        set fn=%%~ni
        rem 新ファイル名はfnの0文字目より右から4文字目までの切り出しと_hogeとfnの右端3文字の切り出し
        ren "%%i" !fn:~0,-3!_hoge!fn:~-3,3!%%~xi
    )
)
pause

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/10/01 22:06

    感謝してます。早々と本当にありがとうございました。

    キャンセル

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

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