プログラミング

プログラミングに関するフォーラムです。VBAは除きます。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : その他)
コマンドプロンプトでフォルダ名一括変換する方法は?
投稿日時: 21/04/22 15:31:47
投稿者: Alice

コマンドプロンプトの質問です。
 
フォルダ名を一括置換したいと思っています。(サブフォルダも置換対象)
(例:フォルダ名に「2020年」を含んだものは、「2021年」に置換)
 
下記サイトより、「for」という構文等を使用してファイル名の一括変換はできるようですが、フォルダ名に関してはどのようにすればいいのでしょうか?
(フォルダだとディレクトリと読み替えられるから、%dとやれば可能かと思い試してみましたが変化なしでした。)
 
https://azure-nakame.com/?p=74
 
何か、アドバイスをお持ちの方がいらっしゃいましたら、投稿して下さると助かります。
宜しくお願い致します。

回答
投稿日時: 21/04/23 10:44:29
投稿者: Suzu

少なくとも、リンク先 の コマンドの対象はファイルです。

引用:
フォルダだとディレクトリと読み替えられるから、%dとやれば可能かと思い
これが%Aの部分を指しているのであれば、%A はページの下の方に解説があるように、単なる変数です。
 
また、ファイル名の先頭またはファイル名の後ろ 特定の位置に文字を「追加」するコードであり
不特定の位置の文字を「置換」するコードではありません。
 
更に、サブフォルダも対象なのであれば、
リンク先の コマンドの参考になる部分は殆ど無いと思います。
 
当方のコマンドラインのスキルでは手に余ります。
 
 
私なら、ツールを探すか、VBS等で組むかのどちらかとなると思います。
 
VBS
Call FolderRename("対象フォルダフルパス", "2021年", "2020年")
MsgBox "Finish"

Sub FolderRename(strTargetFld, strFind, strReplace)
  Dim FSO, Fld, subFld , i

  Set FSO = CreateObject("Scripting.FileSystemObject")
  Set Fld = FSO.GetFolder(strTargetFld)

  For Each subFld In Fld.SubFolders
    i = InStr(1, subFld.Name, strFind, vbTextCompare)
    FolderRename subFld.Path, strFind, strReplace
    If i > 0 Then
      subFld.Name = Left(subFld.Name, i - 1) & strReplace & Mid(subFld.Name, i + Len(strReplace))
    End If
  Next
End Sub
[/quote]

投稿日時: 21/04/24 07:51:52
投稿者: Alice

Suzu様
 
早速の回答ありがとうございます。
 
質問の作業前、コマンドプロンプトのxcopyで深い階層まで簡単にフォルダ構造のコピーができたので(フォルダ名の文字化けも起こらず)、「フォルダ名のリネームもコマンドプロンプトで出来ないか。」と思った次第でした。
 
ご親切にVBSのコードも提案して下さり、本当に感謝です。
 
私は主にExcel VBAで作っているので、Suzu様のアドバイスを元にVBAで処理しようと思います。
(恥ずかしながら、VBAとVBSの違いをよく把握しておらず、ほとんど同じと捉えています。)