前提
前提として以下のようなものがありますがあまりにお気になさらず自由で良いかと思います。
- そもそもrubyとpowershellを使う必要はない。
- デスクトップがカレントディレクトリであると想定
- PowerShellのコードは汚いけどおそらくもっときれいにかける
今回はzipフォルダ作成の自動化が powershell の場合は標準で使えるのであえて powershell を使用ます。
powershell と ruby の 役割分担としては、
rubyで特定のファイルのファイル名を日付の連番にする。
powershellで連番にしたファイルを zipフォルダにする。
rubyでファイル名を日付の連番にするコード
以前にこのブログで紹介したコードと大して変わりありませんが少し改良を加えています。
require "date"
Dir.chdir("../")
count = 0
puts "extension?: "
extension = gets.chomp()
files = Dir.glob("*.#{extension}")
puts "serial_number or date_serial_number? -- (n / d) -- : "
do_pattern = gets.chomp()
if do_pattern == "n"
files.each do |f|
if File.file?(f)
count += 1
File.rename(f, count.to_s + "." + extension)
end
end
elsif do_pattern == "d"
puts "date? -- ( yyyy-mm-dd ) -- : "
date = gets.chomp()
files.each do |f|
if File.file?(f)
File.rename(f, date + "." + extension)
date = Date.parse(date)
date = date.next_day(1)
date = date.strftime("%Y-%m-%d")
end
end
end
exit
この rubyのコード は、特定のファイルのファイル名をただの連番にするか、日付の連番にするか選べます。これは前に書いた記事のとおりなのですが、今回重要なのは exitになります。exitでプロセスをきちんと終了してやることがあとで大事になってきます。
PowerShellでzipフォルダ作成を自動化するコード
ii file_rename.rb
wait-process ruby
cd ../
$files = ls *.txt
$ary = @()
foreach($file in $files){
if($file -match "\d{4}-\d{2}-\d{2}"){
$ary += $file
}
}
$file_first = [system.io.path]::getfilenamewithoutextension($ary[0])
$file_last = [system.io.path]::getfilenamewithoutextension($ary[-1])
$zip_file_name = "xxxx " + $file_first + "_" + $file_last
if(!(test-path $zip_file_name)){
mkdir $zip_file_name
compress-archive -path $ary -destinationpath $zip_file_name
rm $zip_file_name
}
read-host "please_enter -> exit"
コードは少ないですが、いろいろやっているので解説を入れていきます。まず1行目、これは冒頭のrubyコードを実行する構文です。iiはinvoke-itemのエイリアスでinvoke-itemは関連付けられたアプリでファイルを実行します。rbファイルはrubyに関連付けられているのでrubyのシェルが立ち上がる格好です。
次に2行目のwait-processは重要です。こちらの構文を書いておかないと、rubyが起動してもすぐ下の行にプログラムの実行が移ってしまいます。wait-processはプロセスの終了を待ちます。rubyのプロセスが終了するのを待っているわけです。このこともあるのでrubyのコードには
3行目のcdはデスクトップに移動しているだけです。
次に、8~11行目です。こちらは、ファイル名が日付の連番になっていると仮定して、正規表現をつかってファイルをピックアップしています。
12~14行目はzipフォルダ名前付けを自動化するコードです。powershellで配列の先頭の要素を取得するには インデックス[0] 最後の要素を取得するには インデックス[-1] を使います。
psystem.ion.path]::getfilenamewithoutextension()は拡張子を除いたファイル名を取得します。こうすることで最初の日付と最後の日付をzipフォルダの名前付けに使うことができます。
残りの行はzipフォルダ作成のためのコードです。compress-archiveの -pathオプションにはファイルを指定しますが、これは配列を使うことができますので配列を指定しています。-destinationpathオプションには、フォルダのパスを指定しないとだめなので、一旦 mkdir で空のフォルダを作成しています。zipフォルダ作成後は空のフォルダはいらないので rm で削除しています。
compress-archiveの挙動
-destinationpathオプションの値を例えば以下のようにした場合でそれぞれ結果がことなります。
- -destinationpath path
- -destinationpath .\path
ちょっと説明しにくいので実際やってみればわかるかと思います。
最後に ruby には rubyzip というgemがあるようなのであえてPowerShellをつかう必要はないと思いますが、これはこれで少し勉強になったきがします。

コメント