<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ほげぐらまの別館 &#187; Snapshot</title>
	<atom:link href="http://lain.heavy.jp/lain/tag/snapshot/feed" rel="self" type="application/rss+xml" />
	<link>http://lain.heavy.jp/lain</link>
	<description>プログラムに限らずてきとーに、ね？</description>
	<lastBuildDate>Sat, 29 Aug 2015 14:47:38 +0000</lastBuildDate>
	<language>ja</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.7.41</generator>
	<item>
		<title>PowerShellを勉強中</title>
		<link>http://lain.heavy.jp/lain/2011/12/01/350</link>
		<comments>http://lain.heavy.jp/lain/2011/12/01/350#comments</comments>
		<pubDate>Wed, 30 Nov 2011 16:00:00 +0000</pubDate>
		<dc:creator><![CDATA[st.lain]]></dc:creator>
				<category><![CDATA[コンピュータ]]></category>
		<category><![CDATA[プログラム]]></category>
		<category><![CDATA[Hyper-V]]></category>
		<category><![CDATA[PowerShell]]></category>
		<category><![CDATA[Snapshot]]></category>

		<guid isPermaLink="false">http://lain.heavy.jp/lain/2011/12/01/350</guid>
		<description><![CDATA[何かを行おうとすると別の何かを学ばないといけなくて結局遠回りしている気がする・・・・なんてのはザラにある気がしますが、今回のPowerShellもそんな感じ。 【目的】 タスクスケジューラに登録した定時に特定のゲストOS [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>何かを行おうとすると別の何かを学ばないといけなくて結局遠回りしている気がする・・・・なんてのはザラにある気がしますが、今回のPowerShellもそんな感じ。</p>
<p><strong><font size="4">【目的】</font></strong></p>
<p>タスクスケジューラに登録した定時に特定のゲストOSのスナップショットを作成し、同時に過去数日前のスナップショットをマージ(Apply)する</p>
<p><font size="4"><strong>【手段】</strong></font></p>
<p>Hyper-V上の操作となるのでWMI(Windows Management Instrumentation)を使用する、且つ、タスクスケジューラでの操作となるのでCUI(＝スクリプト系)が望ましい。WMIが操作できるスクリプトはWSH, PowerShell辺りとなる・・・・はず？</p>
<p><font size="4"><strong>【参考資料】</strong></font></p>
<p>ほぼほぼ資料は集まっていて、以下を見れば私だってできるハズ！</p>
<ul>
<li><a href="http://blogs.msdn.com/b/taylorb/archive/2008/06/16/hyper-v-wmi-creating-applying-deleting-virtual-machine-snapshots.aspx">Hyper-V WMI: Creating/Applying/Deleting Virtual Machine Snapshots</a>  </li>
<li><a href="http://msdn.microsoft.com/en-us/library/cc136989(v=VS.85).aspx">Virtual System Management Classes</a>  </li>
<li><a href="http://msdn.microsoft.com/en-us/library/windows/desktop/cc136808(v=vs.85).aspx">CIM_ConcreteJob class</a></li>
</ul>
<p>&nbsp;</p>
<p>という感じなのですが、手段としてPowerShellを選ぶと、目的を達成する前にPowerShellを覚えるところから始まるのですよね。元々WMI(WBEM)+JScriptで色々とごさごさやっていたので作れないことは無いですがやはりここは<strong><font color="#ff0000">Windows2008らしくPowerShellで実装</font></strong>しないとね！</p>
<p>ただ・・・・、従来のMicrosoft系スクリプト言語とは結構違う・・・気が・・・。PowerShellのコンセプトを知らないし、<strong>PowerShellが出た当初はこんなのを使う必要はないだろう！</strong>、とか甘く見ていた自分が馬鹿だったなと。因みに今はどうなのでしょうね、MS系の製品と触れ合う現場ではないので正直PowerShellがいかほどに使われているかさっぱりわかりません。</p>
<p>なので・・・・・、とりあえず適当な戦利品。</p>
<pre><pre class="brush: powershell; title: ; notranslate">
$computer                               = &quot;.&quot;
$namespace                              = &quot;root\virtualization&quot;
$msvm_computer_system                   = &quot;Msvm_ComputerSystem&quot;
$msvm_virtual_system_management_service = &quot;Msvm_VirtualSystemManagementService&quot;


# 仮想システムの管理サービスインスタンスを取得する
$vm_vsms = Get-WmiObject -Namespace $namespace -Computer $computer -Class $msvm_virtual_system_management_service
$vm_host = $vm_vsms.SystemName

Write-Output $vm_vsms


# Hyper-V上の全てのコンピュータを列挙する (但し、ホストは除く)
$vm_computers = Get-WmiObject -Namespace $namespace -Computer $computer -Class $msvm_computer_system -Filter &quot;ElementName &amp;lt;&amp;gt; '$vm_host'&quot;
#write-output($vm_computers)

foreach ($vm_computer in $vm_computers) 
{
	write-host + $vm_computer.ElementName
	
	$Snapshots = Get-WmiObject -Namespace root\virtualization -Query &quot;Associators Of {$vm_computer} Where AssocClass=Msvm_ElementSettingData ResultClass=Msvm_VirtualSystemSettingData&quot;
	if ($Snapshots.Count -le 0) {
		continue;
	}


	$script:list = @() 
	foreach ($Snapshot in $Snapshots) 
	{ 
	    $SnapObj = New-Object -TypeName System.Object 
	    $SnapObj | Add-Member -MemberType NoteProperty -Name SnapshotName -Value $Snapshot.ElementName 
	    $SnapObj | Add-Member -MemberType NoteProperty -Name SnapshotID -Value $Snapshot.InstanceID 
	    $SnapObj | Add-Member -MemberType NoteProperty -Name SnapshotParentName -Value ([WMI]$Snapshot.Parent).ElementName 
	    $SnapObj | Add-Member -MemberType NoteProperty -Name SnapshotNote -Value $Snapshot.Note
	    $script:list += $SnapObj 
	}
	$script:list 

&amp;lt;#
	$script = @{} 
	foreach ($Snapshot in $Snapshots) 
	{ 
	    $SnapObj = New-Object -TypeName System.Object 
	    $SnapObj | Add-Member -MemberType NoteProperty -Name SnapshotName -Value $Snapshot.ElementName 
	    $SnapObj | Add-Member -MemberType NoteProperty -Name SnapshotID -Value $Snapshot.InstanceID 
	    $SnapObj | Add-Member -MemberType NoteProperty -Name SnapshotParentName -Value ([WMI]$Snapshot.Parent).ElementName 
	    $SnapObj | Add-Member -MemberType NoteProperty -Name SnapshotNote -Value $Snapshot.Note
	    $script.Add($SnapObj.SnapshotName, $SnapObj);
	} 

	$script.GetEnumerator() | Sort-Object Name | ForEach-Object {&quot;{0}`t{1}&quot; -f $_.Name,($_.Value -join &quot;,&quot;)} 
#&amp;gt;

	write-output &quot;&quot;
}
</pre>
<p>&nbsp;</p>
<p>そして、実行のスクリーンショットらしき物体。</p>
<p><a href="http://lain.heavy.jp/lain/wp-content/uploads/ps_hv.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="ps_hv" border="0" alt="ps_hv" src="http://lain.heavy.jp/lain/wp-content/uploads/ps_hv_thumb.png" width="644" height="545"/></a></p>
<p>しかし・・・・こんなことなら牟田口さんの”Windows PowerShell ポケットリファレンス”を買っておけばよかった・・・・。まぁ、スクリプトが仕上がったら置くかもしれません。それまでしばちお待ちを。</p>
]]></content:encoded>
			<wfw:commentRss>http://lain.heavy.jp/lain/2011/12/01/350/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
