こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

フォルダ名をファイル名の先頭に追加できるバッチ

例えばDドライブ直下にAからZまでの26個のフォルダがあり、例えばフォルダAの中に01から99までの連番で01.txt~99.txtと言うものがあったときに、バッチファイルのアイコンにフォルダAをドラッグアンドドロップするとフォルダ内のファイルがA01.txt~A99.txtと言うファイルが生成される、なお、フォルダはAからZまでまとめてバッチファイルのアイコンにドラッグアンドドロップしたらファイル名をリネームできるものを希望します、そのようなバッチはどのように作ったらよいのでしょうか。

当方の環境はwindows7 HomePremiam 64bitです。

投稿日時 - 2014-07-19 22:25:48

QNo.8684863

困ってます

質問者が選んだベストアンサー

>現在バッチファイルは

そんな馬鹿な。No3のやりとりはどうなったんですか?

for %%A in (%*) do call :sub %%A
pause
goto :EOF

:sub
set "A=%~nx1"
for %%B in (%1\*.txt) do ren "%%B" "%A%%%~nxB"
goto :EOF

となっているはずですが。

投稿日時 - 2014-07-21 00:29:04

補足

失礼、うまく私の希望が伝わっておりませんでした。

私が質問として、あるフォルダに拡張子がtxtの連番のファイルがあるときのことを書きましたが、これはひとつの例であり、リネームしたいのはtxtファイルに限らなかったのです。

そこで、今回、ご回答いただいたバッチファイルの中の txt の箇所を * に編集したところ、希望していたことがうまくいきました。おかげで、手間が省けるようになり大変助かります。

丁寧に何度もやり取りをしていただき、ありがとうございました。

投稿日時 - 2014-07-21 05:34:51

お礼

>そんな馬鹿な。No3のやりとりはどうなったんですか?

No3のやりとりというのは、No.1とNo.2とは別にテストのためにバッチファイルを作って試して見たものだと理解していたのですが、違ったのでしょうか?

とりあえず、今回ご回答いただいたように編集し、実行したところ、リネームはされず、次のような画面が出て止まりました。


D:\>for %A in (D:\a) do call :sub %A

D:\>call :sub D:\a

D:\>set "A=a"

D:\>for %B in (D:\a\*.txt) do ren "%B" "a%~nxB"

D:\>goto :EOF

D:\>pause
続行するには何かキーを押してください . . .

投稿日時 - 2014-07-21 05:20:57

ANo.5

このQ&Aは役に立ちましたか?

9人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.4

>指定されたバッチ ラベルが見つかりません - sub

タイプミスですね。
コピペしてください。

後半の
:sub
の部分がおかしい。

投稿日時 - 2014-07-20 23:34:39

お礼

回答ありがとうございます。

No1とNo2のご回答を参考に編集し、
現在バッチファイルは

for %%A in (%*) do call :sub %%A
goto :EOF

:sub
set "A=%~nx1"
for %%B in (%1\*.txt) do ren "%%B" "%A%%%~nxB"
goto :EOF

となっております。

コピペして編集したのですが、バッチファイル中に間違いがございますでしょうか?

投稿日時 - 2014-07-21 00:06:13

ANo.3

エラー内容を確認してください。

for %%A in (%*) do call :sub %%A
pause
goto :EOF

とすると、実行後に、画面が止まります。

投稿日時 - 2014-07-20 17:02:27

お礼

回答ありがとうございます。

下記のメッセージが出て画面が止まりました。


D:\>for %A in (D:\a) do call :sub %A

D:\>call :sub D:\a
指定されたバッチ ラベルが見つかりません - sub

D:\>pause
続行するには何かキーを押してください . . .

投稿日時 - 2014-07-20 23:08:33

ANo.2

お書きの条件であれば問題ないはずです。
もしかして、フォルダ名のフルパスに空白などが含まれていたりしますか?
その場合は、ren の部分を
ren "%%B" "%A%%%~nxB"
と引用符を付けてください。

set A=%~nx1
の部分も、
set "A=%~nx1"
とした方が安全ですね。

投稿日時 - 2014-07-20 11:03:19

お礼

ありがとうございます。

テストに使ったフォルダ名とファイル名は空白がありました。

ですので、No.2のご回答で教えていただいたようにバッチファイルを編集し、引用符をつけてみました。

しかし、リネームは実行されず、フォルダをDドライブ直下に移動し、フォルダ名をaとし、ファイル名を半角英数字のみにしたのですが、それでもやはりリネームは実行されませんでした。

投稿日時 - 2014-07-20 12:05:29

ANo.1

質問を文字通り読むと、ファイルを新規生成するように読めますが、おそらくリネームしたいのですよね。

for %%A in (%*) do call :sub %%A
goto :EOF

:sub
set A=%~nx1
for %%B in (%1\*.txt) do ren %%B %A%%%~nxB
goto :EOF

%* がドロップされた物一覧
%~nx1 %~nxB がパス名の最下位部分の取り出し

投稿日時 - 2014-07-20 08:47:03

お礼

ありがとうございます。
ご推察のとおり、希望していることはリネームです。

しかし、やってみたのですが、できませんでした。

もしかしたら、ドラッグアンドドロップしたフォルダの中のファイルをリネームする設定ではなく、ドラッグアンドドロップしたフォルダそのものをリネームするバッチ

例として、

setlocal enabledelayedexpansion
:LOOP
if "%~1"=="" goto :EOF
set A=%~dp1
for %%A in ("!A:~0,-1!") do ren "%~1" "%%~nxA%~nx1"
shift
goto LOOP

というようなバッチになっていると思ったりもしたのですが、
バッチが実行されても特に処理されていないように見えます。

投稿日時 - 2014-07-20 09:46:37

あなたにオススメの質問