2014/07/30

PowerShellを使って 複数のサーバー フォルダーを一度に移動させる~Move-WssFolder コマンドレット

昨日、Windows Server 2012 R2 Essentialsに設定してある記憶域プールの再構築作業を行いファイル システムをReFSからNTFSへ変更しました。
これにより、サーバー フォルダーをWindows Azure Backup へバックアップできるようになります。
退避していたサーバー フォルダーを戻す作業を行いますが、数TBもあるためGUIだと長時間の待ち時間が発生。
これは我慢できないと思い、PowerShellを使用し複数のサーバー フォルダーを移動させたいと思います。

単一のサーバー フォルダーを移動させる場合

対象となるサーバー フォルダーをGet-WssFolder コマンドレットから取得し、Move-WssFolder コマンドレットで移動させます。下記サンプルは、サーバー フォルダー名[会社]をDドライブ(記憶域プールの仮想ディスク)に移動させるスクリプトです。
$Folder = Get-WssFolder -Name “会社”
Move-WssFolder -Folder $Folder -NewDrive "D:\" -Force -Confirm:$false
確認プロンプトを非表示にさせたい場合は、
-Force -Confirm:$false
の組み合わせを追記します。
片方だけだと非表示になりません。

複数のサーバー フォルダーを移動させる場合

複数のサーバー フォルダーを移動させたい場合は、ForEachを組み合わせます。
下記サンプルは、退避HDD(Qドライブ)上のサーバー フォルダーを抽出し、Dドライブ(記憶域プールの仮想ディスク)に移動させるスクリプトです。
$Folders = Get-WssFolder | Where-Object{ $_.Path -like "Q:\*"}
ForEach($f in $Folders)
{
    #Write-Host $f.Name, $f.Path
    Move-WssFolder -Folder $f -NewDrive "D:\" -Force -Confirm:$false
}
実行すると下記画像の中断のようにステータスが表示されます。
このスクリプトの難点は、「いつ終わるかが全く分からない!」点です。
2014-07-30_104727
1つのサーバー フォルダーの移動が完了すると、最新のサーバー フォルダーの情報が表示されます。
2014-07-30_105447
この時のダッシュボードを見ると対象となるサーバー フォルダーの状態は「移動しています...」になります。
2014-07-30_111008

参考にしたサイト

余談:バックグランド ジョブを使えばいんじゃないのか?
当初、Start-Job コマンドレットを使用しバッグラウンドで処理させようとしましたが、残念ながら失敗に終わりました。
理由は、Windows Server 2012 R2 Essentialsの[サーバー フォルダーの移動]機能は、並列処理が出来ないため。
Start-Job コマンドレットを調べてみると
並列処理(マルチプロセス)※
で動作するそうです。
※PowerShellから別のPowerShellを起動、処理をさせる
Start-Job コマンドレット、Get-Job コマンドレット、Remove-Job コマンドレット、Recieve-Job コマンドレットはほとんど使った事がなかったのでいい勉強になりました。
スポンサーリンク

スポンサーリンク