2014年7月14日月曜日

[Powershell] Hyper-Vにて仮想マシンの稼働日時の情報を設定する

Hyper-Vで仮想マシンをたくさん作ったりサーバを共有して使っていると、どの仮想マシンをいつまで実行させていたのかが分からなくなります。

ハードディスクの容量が足りなくなった場合など仮想マシンの整理が必要な状況では、動かしていない仮想マシンであればアーカイブしたり削除したりする対象になります。でも、既定の設定ではいつ動かしていたかの情報を取ることができません。

下記のスクリプトをタスクスケジューラ等で定期的に実行すれば、実行中の仮想マシンのメモ欄にスクリプト実行時の日時を書き込みます。


# 
# Hyper-v にて実行中の仮想マシンのメモ情報に処理実行時の日時を書き込むスクリプト
# 


# 実行中の仮想マシンの一覧を取得します。
$RuningVms = (Get-VM | ? {$_.State -eq "Running"}).Name

# 実行中の仮想マシンに対して処理を行います。
foreach ($VmName in $RuningVms){

    # 仮想マシンのメモの情報を取得します。
    $VmNote = (Get-VM -Name $VmName).Notes

    # メモの情報を1行ずつ取得できるように加工します。
    $VmNote = $VmNote -split "`n"

    # メモ情報の行数を取得します。
    $VmNoteLineCount = $VmNote.Length

    # 処理にて使用する変数に初期値を設定します。
    $VmNoteRevised = $null
    $i = 0
    $RunningFlag = 0

    # メモ欄の最終稼働確認日を更新します。
    # 最終稼働確認日が記載された行を削除し、現在の日時が記載された行を追加します。
    while ($i -lt $VmNoteLineCount){
        if($VmNote[$i] -like "最終稼働確認日*"){
            $VmNoteRevised += "最終稼働確認日:" + (Get-Date).DateTime
            $RunningFlag = 1}
        else{
            $VmNoteRevised += $VmNote[$i]}
        $i ++
        if($i -lt $VmNoteLineCount){$VmNoteRevised += "`n"}
        }

    # 最終稼働確認日が記載された行を追加します。
    if($RunningFlag -eq 0){
        $VmNoteRevised += "`n"
        $VmNoteRevised += "最終稼働確認日:" + (Get-Date).DateTime}


    # 仮想マシンのメモ情報を更新します。
    Set-VM -Name $VmName -Notes $VmNoteRevised

}
  
  



2014年7月13日日曜日

[Powershell] ヒア文字列を分割し行ごとに処理できるようにする

Powershellでは複数行の長さの文字列をヒア文字列をして定義できます。
しかし、1行ずつ処理しようとしてもそのままではうまくいきませんでした。
Measure-Objectで調べたら1行の文字列として扱われている様です。


処理を行うためにはこれを分割し文字列の配列に変換する必要があります。
$HereString = $HereString -split "`n"
このようなコマンドで配列にすることができます。

サンプルスクリプト
# 
# ヒア文字列の行数を取得します。

# ヒア文字列を作成します。
# 改行も含めて12文字とカウントされます。

$HereString =@"
ほげほげ1
ほげほげ2
"@ 

""
"ヒア文字列に対してGetTypeメソッドを呼び出します。"
$HereString.GetType()
""
""
"ヒア文字列を1文字づつ呼び出します。"
""
$HereString[0]
$HereString[1]
$HereString[2]
$HereString[3]
$HereString[4]
$HereString[5]
$HereString[6]
$HereString[7]
$HereString[8]
$HereString[9]
$HereString[10]
$HereString[11]

""
"改行は3文字として扱われます。"
"どういう文字コードが当てられているかは分かりません。"
""
"ヒア文字列の行数(Measure-ObjectのCount)"
($HereString | Measure-Object).Count 
""
"ヒア文字列の長さ(Length)"
$HereString.Length
""
""
""
"【ヒア文字列の分割】"
"ヒア文字列を改行文字で分割し、元の変数に格納します。"
$HereString = $HereString -split "`n"
""
"分割したヒア文字列に対してGetTypeメソッドを呼び出します。"
$HereString.GetType()
""
""
"分割したヒア文字列を1行づつ呼び出します。"
"1文字ごとに取り出すことはできないようです。"
""
$HereString[0]
$HereString[1]
""
"分割したヒア文字列の行数(Measure-ObjectのCount)"
($HereString | Measure-Object).Count
""
"分割したヒア文字列の長さ(Length)"
$HereString.Length
  
  



実行すると以下のようになります。


ヒア文字列を1文字づつ呼び出します。















改行は3文字として扱われます。
どういう文字コードが当てられているかは分かりません。

ヒア文字列の行数(Measure-ObjectのCount)
1

ヒア文字列の長さ(Length)
12



【ヒア文字列の分割】
ヒア文字列を改行文字で分割し、元の変数に格納します。

分割したヒア文字列に対してGetTypeメソッドを呼び出します。
True     True     String[]                                 System.Array                                                                                                                                    


分割したヒア文字列を1行づつ呼び出します。
1文字ごとに取り出すことはできないようです。

ほげほげ1
ほげほげ2

分割したヒア文字列の行数(Measure-ObjectのCount)
2

分割したヒア文字列の長さ(Length)
2


[Powershell] 共有フォルダを作成する

共有フォルダを作成するときに使用するPowershellスクリプトを作ってみました。

このサンプルスクリプトではC:\SharedフォルダをSharedという名前の共有フォルダにします。
その共有フォルダにEveryone、フルコントロールの共有権限を設定します。
(NTFS権限の設定はこのスクリプトでは行いません)


# 共有フォルダを作成するスクリプト
#
# 1.フォルダを作成します。
# 2.そのフォルダを共有フォルダにします。
# 3.そのフォルダに共有権限設定を行います。

# 1.
# 共有フォルダにするフォルダのパスを指定します。
# フォルダがない場合は新規にフォルダを作成し、
# 既存のフォルダがある場合はそれを共有フォルダにします。
$SharedFolderPath = "C:\Shared"

# 2.
# 共有フォルダ名を指定します。
# すでに共有フォルダがある場合は処理を中止します。
# 処理中止時には共有権限設定も行いません。
$SharedFolderName = "Shared"

# 3.
# 設定する共有権限を指定します。
$AccoutName = "Everyone"
$FolderPermission = "FULL"


# 1.フォルダの作成
if (-not (Test-Path $SharedFolderPath)){
    New-Item $SharedFolderPath -Type Directory}

# 2.共有フォルダの作成
if (Get-SmbShare –Name $SharedFolderName -ErrorAction SilentlyContinue){
    "すでに共有 $SharedFolderName が存在します。処理を中止します。";Exit}  #処理中止
else{
    New-SmbShare –Name $SharedFolderName –Path $SharedFolderPath}

# 3.共有権限の設定
Grant-SmbShareAccess -Name $SharedFolderName -AccountName $AccoutName -AccessRight $FolderPermission -Force
   
   

参考サイト
PowerShell で smb コマンドレットで 共有 フォルダを作成する
Set-SmbShare

あと、Powershell DSCでの共有フォルダの設定は下のサイトが参考になります。
xSmbShare PowerShell Module (DSC Resource Kit)
Configure SMB Shares with PowerShell DSC