電子書籍の厳選無料作品が豊富!

初めて質問させて頂きます。
PowerShellのスクリプト作成についての質問です。

"C:\test"

・20161101
・20161201
・20170101
・20170201
・20170301

"C:\test"配下に上記の様なフォルダが有ります。
この中から一番新しい「20170301」フォルダ以外の全てのフォルダをzip形式で圧縮するスクリプトをPowerShellで作成したいのですが、
調べても中々うまくいきません。(タイムスタンプはフォルダ名の通りです。)
圧縮後のzipフォルダは圧縮前と同じく"C:\test"配下に出力したいです。

起動はタスクスケジューラを利用し別に作成したWindowsコマンドで作成したバッチバックアップバッチ起動後そのバッチから呼び出したいと思っております。

・zip圧縮後圧縮元を削除したい
・すべてをzip圧縮ではなく一番新しいフォルダ以外を圧縮する。
等がつまずいているポイントです。

良いスクリプトを教えて頂けませんでしょうか?
ご教示お願い致します。

A 回答 (2件)

すでに書いてあるコードとのつながりがわからないので適宜書き直してください。


インデント部分は全角スペースで書いてありますのでコピペ時はご注意を。

zip 圧縮で使用している Compress-Archive コマンドレットは PowerShell v5 で追加された機能らしいので、Windows 10 と Windows Server 2016 意外の環境で実行する場合は .NET Framework 4.5 以上と Windows Management Framework 5.0 のインストールが必要です。

金曜なので早く帰りたく、あまりデバッグしておりません。

function Compress-OldItems
{
 param
 (
  [Parameter(Mandatory)]
  [string]$Path,
 )

 $oldItems = Get-ChildItem $Path -Directory | Sort-Object Name -Descending | Select-Object -Last ((Get-ChildItem $Path -Directory).Length - 1)

 foreach ($item in $oldItems)
 {
  Compress-Archive -Path $item.FullName -DestinationPath "$($item.FullName).zip" -Force
  Remove-Item -Path $item.FullName -Force -Recurse
 }
}

Compress-OldItems E:\hoge などと呼び出してみてください。

引数は対象となるフォルダーのフルパスです。

Get-ChildItem $Path -Directory
対象フォルダーにあるフォルダーの一覧を取得しています。

Sort-Object Name -Descending
フォルダーの一覧をフォルダー名で降順にソートしています。
Name の代わりに CreationTime なら作成日時、LastWriteTime なら最終更新日時でソートできますね。

Select-Object -Last ((Get-ChildItem $Path -Directory).Length - 1)
ソート済みの一覧から指定した数だけ要素を取り出す -Last という引数があります。
通常は 「-Last 1」 とかして最後の一つだけを引き出したりするようです。
今回は Get-ChildItem で取得した全フォルダーの数から 1 を引いた数だけ取り出すようにしています。

こいつらを foreach でぐるぐるまわし、フォルダーひとつずつを zip 圧縮し、オリジナルを削除しています。
    • good
    • 1
この回答へのお礼

遅くなってしまいました。

ソースコードも書いて頂きありがとうございます。

zip.ps1

function Compress-OldItems C:test
{
 param
 (
  [Parameter(Mandatory)]
  [string]$Path,
以下略

コピペさせて頂きつつ上記の様なスクリプトを作成しましたがパスがうまく指定できないです。
提案して頂いたのに不甲斐なく申し訳ないです。

お礼日時:2017/03/16 16:40

PowerShellのスクリプトの専門家ではありませんが、例外がある処理をするならば、


 例外となる事案を避けておいて、
 一般の処理をして
 避けていた事案を元に戻す
という方略ではいかがですか?

つまり、
 圧縮したくない最新のフォルダを別の場所に移動
 すべてのフォルダを圧縮
 すべてのフォルダを削除
 別の場所の退避していたフォルダを戻す
といった処理手順ではいかがでしょう?
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
圧縮したく無いフォルダの退避も貴重な意見として
検証したいと思います。

お礼日時:2017/03/16 16:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!