• ベストアンサー

powershellでフォルダのリネーム

フォルダの先頭のファイル(1が最初)をフォルダ名としたい場合、どんな式になるんでしょうか? 必要な要素は以下だと思います。 1:リネーム対象のフォルダ名 2:フォルダ内の先頭のファイル名 1を2で置き換えたいのです フォルダ1 └file1 └file2 フォルダ2 └hoge1 └hoge2 file1 └file1 └file2 hoge1 └hoge1 └hoge2 こういう結果にしたいのですが、可能ですか? get-childrenでフォルダ一覧が取得出来ますが、そこから進展がないです。

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

  • ベストアンサー
  • asciiz
  • ベストアンサー率70% (6871/9771)
回答No.4

回答No.2をperlで組んだらこんな感じになりました。 powershell でも似たようなプログラムを組むことになるんじゃないかと思います。 printはデバッグの名残なので、全部無くても構いません。 少しpowershellの文法を見てみましたが、配列に追加する += とか、配列をソートする Sort-Object とかあるのでほとんどそのまま移植できそうな気がしました。 ただ、if修飾子(後置if)は無いっぽいのでそこは普通のif文にしなきゃいけないかもです。 #perlでは、単純変数は $x、配列変数は @x のように書いて使い分ける必要があります。 #$debug = 0; にすれば、表示が少し減ります。 あ、リネーム後の名前がかぶった時の処理をしてませんでした かぶった場合、rename がエラーになって元ディレクトリ名のまま残ることになります。 ---ソース(ren_dir.pl)---- use strict; my $debug = 1; my @dirs = (); opendir(DIR, "." ) || die "Can't open current dir. \n"; foreach (readdir(DIR)) { next if (/^\.{1,2}/); # "."(カレント)、".."親ディレクトリ はスキップ if (-d) {push(@dirs, $_)}; # ディレクトリのみリストに追加 } closedir(DIR); foreach my $dir (@dirs) { my @files = (); print "dir $dir\n"; opendir(DIR, "./$dir" ) || die "Can't open dir. $dir\n"; foreach my $file (readdir(DIR)) { print "file $file\n" if $debug; if (-f "./$dir/$file") { print "add $file\n" if $debug; push(@files, $file); # ファイル名ならリストに加える }; } @files = sort @files; # ファイル名リストのソート print "files: @files\n" if $debug; my $to_name = shift @files; # 最初のファイル名を取り出す print "rename $dir to $to_name\n\n"; rename($dir, $to_name); } ----実行結果---- C:\Users\xxxxxxxx\Desktop\perl\ren_dir>dir ドライブ C のボリューム ラベルは OS です ボリューム シリアル番号は 44FA-B451 です C:\Users\xxxxxxxx\Desktop\perl\ren_dir のディレクトリ 2021/01/12 15:31 <DIR> . 2021/01/12 15:31 <DIR> .. 2021/01/12 15:25 <DIR> abc 2021/01/12 14:27 <DIR> def 2021/01/12 15:35 828 ren_dir.pl 2021/01/12 15:25 <DIR> xyz 1 個のファイル 828 バイト 5 個のディレクトリ 163,903,242,240 バイトの空き領域 C:\Users\xxxxxxxx\Desktop\perl\ren_dir>perl ren_dir.pl dir abc file . file .. file test2.txt add test2.txt file test3.txt add test3.txt file test4.txt add test4.txt files: test2.txt test3.txt test4.txt rename abc to test2.txt dir def file . file .. file testb1.txt add testb1.txt file testb2.txt add testb2.txt file testb3.txt add testb3.txt files: testb1.txt testb2.txt testb3.txt rename def to testb1.txt dir xyz file . file .. file testc1.txt add testc1.txt file testc2.txt add testc2.txt file testc3.txt add testc3.txt files: testc1.txt testc2.txt testc3.txt rename xyz to testc1.txt C:\Users\xxxxxxxx\Desktop\perl\ren_dir>dir ドライブ C のボリューム ラベルは OS です ボリューム シリアル番号は 44FA-B451 です C:\Users\xxxxxxxx\Desktop\perl\ren_dir のディレクトリ 2021/01/12 15:36 <DIR> . 2021/01/12 15:36 <DIR> .. 2021/01/12 15:36 826 ren_dir.pl 2021/01/12 15:25 <DIR> test2.txt 2021/01/12 14:27 <DIR> testb1.txt 2021/01/12 15:25 <DIR> testc1.txt 1 個のファイル 826 バイト 5 個のディレクトリ 163,903,238,144 バイトの空き領域

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • NuboChan
  • ベストアンサー率47% (801/1677)
回答No.3

OKWAVEで昔々10年以上前に   同じような相談があった。 自前の来歴記事禄を参照して  同記事を検索したが流石に404でした。  しかし参考にしたバッチ処理で実現した記事が   今でも、googleさんで検索するとヒットします。

すると、全ての回答が全文表示されます。
  • asciiz
  • ベストアンサー率70% (6871/9771)
回答No.2

powershellは普段使わないので具体例は出せませんけども、やり方としては >カレントディレクトリのディレクトリのリストを得る >ディレクトリリストの1つごとに >>>当該ディレクトリ内のファイルリストを得る >>>結果をソートする >>>ディレクトリの名前を、一番最初になったファイル名と同じにする >次のディレクトリの処理へループ こんな感じの処理になろうかと思います。 というのも、「フォルダ内の先頭ファイル名」と言っても、普通に「ディレクトリの最初のファイル名」を得ようとすると、必ずしも名前順に並んだ最初のものが得られるわけではないので、一旦ファイル名全部取得して自分で並べなおさなければ「先頭ファイル名」が判明しないからです。 また最初にディレクトリリストを取るのは、ディレクトリをリネーム後に、通常の手続きで「次のディレクトリ」を得ようとすれば、既に処理したディレクトリを得てしまったり、そうすると逆に処理しないディレクトリが出てしまったりする恐れもあるので、きちんと全フォルダ処理するために、念のためやっておいた方が良い気がします。 (まあ、リネームではディレクトリエントリ順は変わらなそうなので、大丈夫かもしれませんが…)

すると、全ての回答が全文表示されます。
  • Nobu-W
  • ベストアンサー率39% (724/1831)
回答No.1

私の拙い説明より・・・ https://buralog.jp/powershell-folder-rename/ 読んで頂いた方がいいかもですっ 補足なんかもありますしねっ 読んでみて下さい m(_ _)m

すると、全ての回答が全文表示されます。

関連するQ&A