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

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

新規登録して質問してみよう
ただいま回答率
85.48%
コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

バッチファイル

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

Q&A

解決済

2回答

1804閲覧

括弧()を含むファイル名を括弧()内部の文字ごと削除した名前に変更したい

koburon

総合スコア30

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

バッチファイル

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

0グッド

0クリップ

投稿2023/05/15 09:20

編集2023/05/15 09:22

前提

ある講習会に参加した社員のレポート(PDF)を保存しているフォルダがあり、
ファイル名は全て「連番 (部署名_氏名).pdf」とついています。

実現したいこと

タイトルの通り、ファイル名の括弧()内部を全て削除して、

「連番 (部署名_氏名).pdf」→「連番.pdf」

というファイル名に変換するバッチファイルを作成したいです。

試したこと

参考にしたURLおよび記載されたコードを作成しました。

ファイル名 一括変換 バッチファイル 作成方法

bat

1@echo off 2rem ショートカットのつくファイル名を削除するバッチです。 3rem 10行目のコードを変えて色んな文字の変換が出来ます。 4rem ループで%%fをコールする 5for %%f in ( * ) do call :sub “%%f” 6exit /b 7rem コール先のバッチ 「- ショートカット」と付くファイル名を””(空白)に置換 8:sub 9set fname=%1 10set fname=%fname: – ショートカット=””% 11ren %1 %fname% 12pause

ここから、括弧()の全てを削除するコードにしようと書いたものが以下の通りです。

bat

1@echo off 2rem ファイル名を変更するバッチです。 3rem コードを変えて色んな文字の変換が出来ます。 4rem ループで%%fをコールする 5for %%f in ( * ) do call :sub “%%f” 6exit /b 7rem コール先のバッチ ( 文字 )と付くファイル名を”(空白なし)に置換 8:sub 9set fname=%1 10set fname=%fname: (*=_% 11set fname=%fname:(*=_% 12set fname=%fname:)=% 13ren %1 %fname% 14pause

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

作成したバッチファイルをフォルダに移動しクリックで実行したところ、以下のように「指定されたファイルが見つかりません」と表示されて処理が終了します。

指定されたファイルが見つかりません。 指定されたファイルが見つかりません。 指定されたファイルが見つかりません。 指定されたファイルが見つかりません。

括弧()内の文字をワイルドカードで指定できると考えたのですが、上手くできませんでした。
ファイル名のつけ方が普通と違うというのは承知してますが、ご教示いただけますと幸いです。
よろしくお願いいたします。

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

PC:Windows11

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

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

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

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

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

guest

回答2

0

ベストアンサー

まず、callの行の引用符が全角になっていますので、引用符の意味をなしません。
(全角と半角に無頓着だと、色々問題が起こります)

次に、文字列置換で*を使えるのは置換元の先頭だけです。set /?で表示される説明参照。
つまり、「(で終わる任意の文字列」を置換するのは可能ですが、「(で始まる任意の文字列」を置換する機能はありません。

そこで、「削除する文字列」をまず取り出して、それを空に置換するという方法を採る必要があります。
拡張子まで削除されるので、後で付けます。

変数の展開を2回する必要があるので、オーソドックスな方法として、遅延環境変数展開を使います。
setlocal enabledelayedexpansionと書いておいて、2回目は%でなく!で変数展開)

CMD

1@echo off 2setlocal enabledelayedexpansion 3for %%f in ( * ) do call :sub "%%f" 4exit /b 5:sub 6set "fname=%~1" 7set "fname=%fname: (=(%" 8rem 括弧以前を削除した物をdelstrに入れる。つまり、括弧以降全部を delstr に入れる 9set "delstr=%fname:*(=(%" 10rem 括弧以降全部を削除 11set "fname=!fname:%delstr%=!" 12ren %1 "%fname%%~x1" 13pause

投稿2023/05/15 11:26

編集2023/05/15 11:29
otn

総合スコア84533

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

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

koburon

2023/05/16 00:56

回答ありがとうございます。 フォルダ内に重複する数字のファイルが1つ入っていたので、最初は「重複している」というようなエラーメッセージが表示されましたが、それを一旦別の場所に移動して再度実行したところ問題なく、連番のみのファイル名に変更できました。 こちらをベストアンサーとさせていただきます。
otn

2023/05/16 11:06 編集

もし一回しか実行しないのなら、別のアプローチとしては、 dir /b | clip で、ファイル一覧をコピーして、Excelにペーストし、 列のコピーや、「データ」の「区切り位置」で空白や括弧やピリオドで分割などをして欲しいデータを作り、 "ren "と連結するなどで、目的の ren コマンドラインを作成して、 BATファイルにコピーして実行 あれこれ考えている間に出来ます。 一度きりでなく、週一や月一でこれをやるのはつらいので、その場合はこういうバッチ(や何らかのプログラム)を作りますが。
koburon

2023/05/17 01:57

コメントありがとうございます。 実際、今回のような作業依頼は頻度が低く、ファイル数も50程度です。試しにExcelで 「ren <<変更するファイル名>> <<変更後のファイル名>>」と作成し、 でbatファイルをして実行したほうが早いと感じました。 参考にさせていただきます。
guest

0

wshでやってみては

//rename.vbs

vbscript

1Set oFS = CreateObject("Scripting.FileSystemObject") 2Set reg = CreateObject("VBScript.RegExp") 3with reg 4 .Pattern = "(.+)?\(.*?\)(\.pdf)$" 5 .IgnoreCase = True 6 .Global = True 7end with 8Set oDir= oFS.GetFolder(".") 9For Each oFile in oDir.files 10 if reg.test(oFile.Name) then 11 oFile.Name=reg.replace(oFile.Name,"$1$2") 12 end if 13Next

パスを通すか、リネームするフォルダにvbsファイルをおき
「rename」もしくは「cscript rename.vbs」とする

投稿2023/05/15 10:31

yambejp

総合スコア114814

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

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

koburon

2023/05/16 00:57

回答ありがとうございます。 こちらも試して実行し、成功しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問