<?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>Personal Weblog of John Wood &#187; Scripts</title>
	<atom:link href="http://www.webofwood.com/category/scripts/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.webofwood.com</link>
	<description>Wordpress weblog of John Wood, a Database Administrator</description>
	<lastBuildDate>Fri, 13 Aug 2010 18:52:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Using Powershell to Set Up SQL Server Mirroring</title>
		<link>http://www.webofwood.com/2010/07/29/powershell-sqlserver-mirroring/</link>
		<comments>http://www.webofwood.com/2010/07/29/powershell-sqlserver-mirroring/#comments</comments>
		<pubDate>Thu, 29 Jul 2010 13:50:07 +0000</pubDate>
		<dc:creator>John Wood</dc:creator>
				<category><![CDATA[Powershell]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Scripts]]></category>
		<category><![CDATA[mirror]]></category>
		<category><![CDATA[script]]></category>

		<guid isPermaLink="false">http://www.webofwood.com/?p=123</guid>
		<description><![CDATA[Management recently decided to use database mirroring as our DR solution. Because mirroring is done at the database level and not at the server level, I had a lot, a very lot of databases to be mirrored. To make it easier I decided to cobble together a simplistic script to do this. I typically use [...]]]></description>
			<content:encoded><![CDATA[<p>Management recently decided to use database mirroring as our DR solution. Because mirroring is done at the database level and not at the server level, I had a lot, <strong><em>a very lot</em></strong> of databases to be mirrored. To make it easier I decided to cobble together a simplistic script to do this.</p>
<p>I typically use a &#8216;management&#8217; server for most of my needs and have therefore written the script to use UNC type pathing for the primary as well as mirror server. You will also notice I defaulted several of the parameters. This is handy when working on a set of servers for multiple databases.</p>
<pre class="brush: ps">&lt;#
     .SYNOPSIS
          Set up a mirrored database
     .DESCRIPTION
          Backs up a database and tlog, copies it to the destination,
		  Restores the database on the mirror server, sets up the partner,
		  and starts the mirror.
     .PARAMETER  database
          The name of the database to be mirrored
     .PARAMETER  SourceServer
          The name of the primary server
     .PARAMETER  SourcePath
          Local Path for the backup
     .PARAMETER  DestServer
          The name of mirror server
     .PARAMETER  DestPath
          Local path for restore file
     .EXAMPLE
          PS C:\&gt; Invoke-Mirror -database 'string value' 1
		  			-SourceServer 'string\string' -SourcePath 'string' `
					-DestServer 'string\string' -DestPath 'string'
     .NOTES
          AUTHOR:    John P. Wood
          CREATED:   July, 2010
          VERSION:   1.0.5
          The SQL connections rely on Windows authentication and assumes Endpoints
          already exist. Error checking is minimal (i.e. no check is made to
          verify the recovery model is FULL).
#&gt;
Param(
	[Parameter(Mandatory=$true)]
	[string]$database,
	[string]$SourceServer='lcfsqlvs3\sqlvs3',
	[string]$SourcePath='U:\SQL Backups',
	[string]$DestServer='ldrsqlvs3\sqlvs3',
	[string]$DestPath='U:\SQL Backups'
	)
Set-StrictMode -Version 2
[Void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo")
[Void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO")
[Void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended")
Function Get-FileName {
	Param([string]$path)
	$names = $path.Split('\\')
	$names[$names.Count - 1]
}
Function New-SMOconnection {
    Param (
		[string]$server
	)
	$conn = New-Object Microsoft.SqlServer.Management.Common.ServerConnection($server)
	$conn.applicationName = "PowerShell SMO"
	$conn.StatementTimeout = 0
	$conn.Connect()
	if ($conn.IsOpen -eq $false) {
		Throw "Could not connect to server $($server) for database backup of $($dbname)."
	}
	$smo = New-Object Microsoft.SqlServer.Management.Smo.Server($conn)
	$smo
}
Function Invoke-SqlBackup {
	$dbbk = new-object ('Microsoft.SqlServer.Management.Smo.Backup')
	$dbbk.Action = [Microsoft.SqlServer.Management.Smo.BackupActionType]::Database
	$dbbk.BackupSetDescription = "Full backup of " + $database
	$dbbk.BackupSetName = $database + " Backup"
	$dbbk.Database = $database
	$dbbk.MediaDescription = "Disk"
	$device = "$SourcePath\$bkpfile"
	$dbbk.Devices.AddDevice($device, 'File')
	$smo = New-SMOconnection -server $SourceServer
	Try {
		$dbbk.SqlBackup($smo)
		$dbbk.Action = [Microsoft.SqlServer.Management.Smo.BackupActionType]::Log
		$dbbk.SqlBackup($smo)
		$smo.ConnectionContext.Disconnect()
	}
	Catch {
		$ex = $_.Exception
		Write-Output $ex.message
		$ex = $ex.InnerException
		while ($ex.InnerException)
		{
			Write-Output $ex.InnerException.message
			$ex = $ex.InnerException
		};
		continue
	}
	Finally {
		if ($smo.ConnectionContext.IsOpen -eq $true) {
			$smo.ConnectionContext.Disconnect()
		}
	}
}
Function Invoke-SqlRestore {
	Param(
		[string]$filename
	)
	# Get a new connection to the server
    $smo = New-SMOconnection -server $DestServer
    $backupDevice = New-Object("Microsoft.SqlServer.Management.Smo.BackupDeviceItem") ($filename, "File")
	# Get local paths to the Database and Log file locations
	If ($smo.Settings.DefaultFile.Length -eq 0) {$DBPath = $smo.Information.MasterDBPath }
	Else { $DBPath = $smo.Settings.DefaultFile}
	If ($smo.Settings.DefaultLog.Length -eq 0 ) {$DBLogPath = $smo.Information.MasterDBLogPath }
	Else { $DBLogPath = $smo.Settings.DefaultLog}

	# Load up the Restore object settings
	$Restore = new-object Microsoft.SqlServer.Management.Smo.Restore
	$Restore.Action = 'Database'
	$Restore.Database = $database
    $Restore.ReplaceDatabase = $true
    $Restore.NoRecovery = $true
	$Restore.Devices.Add($backupDevice)

	# Get information from the backup file
	$RestoreDetails = $Restore.ReadBackupHeader($smo)
	$DataFiles = $Restore.ReadFileList($smo)

	# Restore all backup files
	ForEach ($DataRow in $DataFiles) {
        $LogicalName = $DataRow.LogicalName
        $PhysicalName = Get-FileName -path $DataRow.PhysicalName
		$RestoreData = New-Object("Microsoft.SqlServer.Management.Smo.RelocateFile")
		$RestoreData.LogicalFileName = $LogicalName
		if ($DataRow.Type -eq "D") {
			# Restore Data file
			$RestoreData.PhysicalFileName = $DBPath + "\" + $PhysicalName
		}
		Else {
			# Restore Log file
			$RestoreData.PhysicalFileName = $DBLogPath + "\" + $PhysicalName
		}
		[Void]$Restore.RelocateFiles.Add($RestoreData)

	}
	Try {
	$Restore.SqlRestore($smo)
	# If there are two files, assume the next is a Log
	if ($RestoreDetails.Rows.Count -gt 1) {
		$Restore.Action = [Microsoft.SqlServer.Management.Smo.RestoreActionType]::Log
		$Restore.FileNumber = 2
		$Restore.SqlRestore($smo)
	}
		$smo.ConnectionContext.Disconnect()
	}
	Catch {
		$ex = $_.Exception
		Write-Output $ex.message
		$ex = $ex.InnerException
		while ($ex.InnerException)
		{
			Write-Output $ex.InnerException.message
			$ex = $ex.InnerException
		};
		continue
	}
	Finally {
		if ($smo.ConnectionContext.IsOpen -eq $true) {
			$smo.ConnectionContext.Disconnect()
		}
	}
}
Function Set-Mirror {
	Param([string]$server,[string]$database,[string]$partner)
	$conn = "Server=$server; Integrated Security=SSPI; Database=Master"
	$cn = New-Object "System.Data.SqlClient.SqlConnection" $conn
	$cn.Open()
	$cmd = New-Object "System.Data.SqlClient.SqlCommand"
	$cmd.CommandType = [System.Data.CommandType]::Text

	$cmd.CommandText = "ALTER DATABASE $database SET PARTNER = 'TCP://" + $partner + ":5022'"
	$cmd.Connection = $cn
	$cmd.ExecuteNonQuery()
	$cn.Close()
	Trap {
		$ex = $_.Exception
		Write-Output $ex.message
		$ex = $ex.InnerException
		while ($ex.InnerException)
		{
			Write-Output $ex.InnerException.message
			$ex = $ex.InnerException
		};
		continue
	}
}
$srcUNC = Join-Path "\\$($SourceServer.Split('\\')[0])" $($SourcePath.Replace(':','$'))
if (-not(Test-Path $srcUNC)) { New-Item $srcUNC -ItemType directory | Out-Null}
$destUNC = Join-Path "\\$($DestServer.Split('\\')[0])" $($DestPath.Replace(':','$'))
if (-not(Test-Path $destUNC)) { New-Item $destUNC -ItemType directory | Out-Null}
$bkpfile = $($SourceServer.Replace("\", "$")) + "_" + $database + "_FULL_" + $(get-date -format yyyyMMdd-HHmmss) + ".bak"
Invoke-SqlBackup
Copy-Item $(Join-Path $srcUNC $bkpfile) -Destination $destUNC -Verbose
Invoke-SqlRestore -filename $bkpfile
# Establish Mirroring from the mirrored database
Set-Mirror -server $DestServer -database $database -partner $($SourceServer.Split('\\')[0])
# Start the mirror
Set-Mirror -server $SourceServer -database $database -partner $($DestServer.Split('\\')[0])</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.webofwood.com/2010/07/29/powershell-sqlserver-mirroring/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Asynchronous Processing using Powershell Jobs</title>
		<link>http://www.webofwood.com/2010/03/17/asynchronous-powershell-jobs/</link>
		<comments>http://www.webofwood.com/2010/03/17/asynchronous-powershell-jobs/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 14:48:57 +0000</pubDate>
		<dc:creator>John Wood</dc:creator>
				<category><![CDATA[Powershell]]></category>
		<category><![CDATA[Scripts]]></category>
		<category><![CDATA[asynchronous]]></category>
		<category><![CDATA[job]]></category>
		<category><![CDATA[script]]></category>

		<guid isPermaLink="false">http://www.webofwood.com/?p=116</guid>
		<description><![CDATA[Powershell is a fantastic tool to use for management of multiple computers. I have been slowly converting many of our administrative functions from a hodge-podge mixture of CMD, BAT, VPS, Python, and Perl scripts. One daily administrative talks is copying a variety of backups from a variety of Windows servers to our data ’warehouse’ where [...]]]></description>
			<content:encoded><![CDATA[<p>Powershell is a fantastic tool to use for management of multiple computers. I have been slowly converting many of our administrative functions from a hodge-podge mixture of CMD, BAT, VPS, Python, and Perl scripts. One daily administrative talks is copying a variety of backups from a variety of Windows servers to our data ’warehouse’ where they are then copied to tape.</p>
<p>I recently found the “Jobs” cmdlets in Powershell V2.0. With “Jobs” you can asynchronously process multiple tasks (e.g. copying backups from many remote machines to data storage on the current local machine). In my case, running the copies synchronously results in the process spanning over to the next morning. Backups are stored daily. If a backup is taken on Wednesday, I can’t have it being stored in our warehouse under Thursday.</p>
<p><span id="more-116"></span></p>
<p>Using Powershell “Jobs”, I can accommodate copying all the backups within the daily timeframe. However, I did wrestle with using “Jobs” at first. Mainly because I couldn’t see what happened with a JOB on my console! The trick is to make sure you issue a Receive-Job cmdlet after a JOB has finished.</p>
<h3>Here a a couple of examples to try:</h3>
<p><span style="font-size: xx-small;">These example assume you are running Powershell V2.0 and you have enabled remoting on the machine your running this. Remoting does not have to be enabled on the remote servers but must be enabled on your local machine.</span></p>
<h5>Begin with a simple copy you know works.</h5>
<pre class="brush: ps"># Copies a directory and all files and sub-directories, I would
# suggest using something small to quickly see results
$source = "\\RemoteServer\d$\Backups # your remote path
$target = "W:\WoodyzTest"            # your local path
Copy-Item -Path $source -Destination $target -Recurse Verbose</pre>
<h5>Next, we’ll take the Copy-Item and put it in a Start-Job</h5>
<pre class="brush: ps">$source = "\\RemoteServer\d$\Backups # your remote path
$target = "W:\WoodyzTest"            # your local path
$job Start-Job -Scriptblock {
Copy-Item -Path $source -Destination $target -Recurse -Verbose
}
Wait-Job $job  # For this test, we’ll wait for the job to complete</pre>
<p>Run the above script, look at what is returned in the console, and then check to see of the copy worked.</p>
<p>Surprise! The directory was not copied! What happened? I have no idea because I did not see anything in the console. There were no error messages!</p>
<h5>OK, let’s now add a Receive-Job</h5>
<pre class="brush: ps">$source = "\\RemoteServer\d$\Backups # your remote path
$target = "W:\WoodyzTest"            # your local path
$job Start-Job -Scriptblock {Copy-Item -Path $source -Destination $target -Recurse -Verbose }
Wait-Job $job  # For this test, we’ll wait for the job to complete
Receive-Job $job  # will now display any results from the job</pre>
<p>Now what do you see on the console? We have yet another surprise! The console shows we have an error in our Copy-Item. But why? It worked before when we ran it outside of a JOB.</p>
<p>I took a SWAG at it and decided to try enclosing the entire original script inside the JOB Scriptblock:</p>
<h5>Here is the entire, final, working script:</h5>
<pre class="brush: ps">$job = Start-Job -ScriptBlock {
    $source = "\\Lcfltr01\d$\SQL Backups\lcfltr01"
    $target = "W:\WoodyzTest"
    Copy-Item -Path $source -Destination $target -Recurse -Verbose
}
Wait-Job $job
Receive-Job $job</pre>
<p>I have not read up on it yet, but deductive reasoning implies: because the JOB creates a new background process, the local variables are not available to the newly created thread. Makes sense to me.</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.webofwood.com/2010/03/17/asynchronous-powershell-jobs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cycle Those SQL Server Logs</title>
		<link>http://www.webofwood.com/2010/02/15/cycle-those-sql-server-logs/</link>
		<comments>http://www.webofwood.com/2010/02/15/cycle-those-sql-server-logs/#comments</comments>
		<pubDate>Mon, 15 Feb 2010 21:21:04 +0000</pubDate>
		<dc:creator>John Wood</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Powershell]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Scripts]]></category>
		<category><![CDATA[errorlog]]></category>
		<category><![CDATA[schedule]]></category>
		<category><![CDATA[script]]></category>

		<guid isPermaLink="false">http://www.webofwood.com/?p=62</guid>
		<description><![CDATA[Don’t you just hate it when you open one of your server logs in Management Studio and then you have to wait forever to review it because it never stops reading? I’ve done it enough times and decided to put an end to it or at least greatly reduce the incidence. Using Powershell and a [...]]]></description>
			<content:encoded><![CDATA[<p>Don’t you just hate it when you open one of your server logs in Management Studio and then you have to wait forever to review it because it never stops reading? I’ve done it enough times and decided to put an end to it or at least greatly reduce the incidence.</p>
<p>Using Powershell and a simple script to execute Sp_Cycle_Errorlog, I now have a weekly, Windows scheduled task which executes the sproc to cycle the logs for all my SQL Servers.</p>
<pre class="brush: ps">foreach ($svr in get-content D:\Scripts\Servers.TXT ){
    $svr
    Invoke-Expression 'SQLCMD -E -S $svr -Q "Exec Sp_Cycle_Errorlog"' | Out-Null
	}</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.webofwood.com/2010/02/15/cycle-those-sql-server-logs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linked Server 64bit Deficiency</title>
		<link>http://www.webofwood.com/2009/08/07/linked_server_64bit/</link>
		<comments>http://www.webofwood.com/2009/08/07/linked_server_64bit/#comments</comments>
		<pubDate>Fri, 07 Aug 2009 17:00:41 +0000</pubDate>
		<dc:creator>Woody</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Scripts]]></category>
		<category><![CDATA[2000]]></category>
		<category><![CDATA[2005]]></category>
		<category><![CDATA[32bit]]></category>
		<category><![CDATA[64bit]]></category>
		<category><![CDATA[linked server]]></category>
		<category><![CDATA[sproc]]></category>

		<guid isPermaLink="false">http://www.webofwood.com/2009/08/07/create-linked-server-view-of-sql-server-2000-32bit-on-64bit-sql-server-2005/</guid>
		<description><![CDATA[First off, I need to give recognition to Joel Mansford for his blog which gave me the answer to my problem. Connecting SQL Server 2005 x64 to SQL Server 7 (32bit) as a linked server!? After creating a linked server on a 64bit SQL Server 2005 instance, I then needed to create a view which [...]]]></description>
			<content:encoded><![CDATA[<p>First off, I need to give recognition to Joel Mansford for his blog which gave me the answer to my problem.<br />
<a href="http://joelmansford.wordpress.com/2007/08/10/connecting-sql-server-2005-x64-to-sql-server-7-32bit-as-a-linked-server/">Connecting SQL Server 2005 x64 to SQL Server 7 (32bit) as a linked server!? </a></p>
<p>After creating a linked server on a 64bit SQL Server 2005 instance, I then needed to create a view which referenced the linked server. The linked server is a SQL Server 2000 32bit instance. However, when I tried to create the view, I got this error:  <em>Cannot obtain the schema rowset &#8220;DBSCHEMA_TABLES_INFO&#8221; for OLE DB provider &#8220;SQLNCLI&#8221;.</em></p>
<p>This really proved to be a conundrum because I had just recently created the same linked server and view on another SQL 2005 instance. However, I had not yet connected the fact the 2005 instance was 32bit as opposed to the one I was now working on, which is 64bit.</p>
<p>I wrestled with it being a permissions issue for a while but ruled that out when I could not create the view even while using a domain admin account having authority of all the instances. A search on Google, using the above mentioned error message, turned up Joel&#8217;s blog. His specific problem was relative to SQL Server 7 but the answer applied to SQL Server 2000 also. He had found the original post of the ultimate solution and was good enough to include it in his blog which I have an excerpt here.</p>
<blockquote><p>I found an extremely helpful post by Marek Adamczuk at <a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=62887&amp;SiteID=1">http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=62887&amp;SiteID=1</a>. Marek  explains the 32-bit editions are missing a stored procedure on the master database called <strong>sp_tables_info_rowset_64.</strong></p>
<p>Marek’s solution is to create a wrapper on the master database as follows (his code not mine):</p>
<pre class="brush: sql">create procedure sp_tables_info_rowset_64
    @table_name sysname,
    @table_schema sysname = null,
    @table_type nvarchar(255) = null
as
declare @Result int set @Result = 0
exec @Result = sp_tables_info_rowset
    @table_name,
    @table_schema,
    @table_type</pre>
</blockquote>
<p>It would appear the existing sproc does the same thing but just needs to be referenced using the 64bit name. Kudos to both Joel and to Marek for making this solution available!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.webofwood.com/2009/08/07/linked_server_64bit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PowerShell Where Clause &#8211; Compare to a list of values</title>
		<link>http://www.webofwood.com/2009/08/04/powershell-where-compare-list/</link>
		<comments>http://www.webofwood.com/2009/08/04/powershell-where-compare-list/#comments</comments>
		<pubDate>Tue, 04 Aug 2009 17:28:35 +0000</pubDate>
		<dc:creator>Woody</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Powershell]]></category>
		<category><![CDATA[Scripts]]></category>

		<guid isPermaLink="false">http://www.webofwood.com/2009/08/04/powershell-where-clause-compare-to-a-list-of-values/</guid>
		<description><![CDATA[As a databases admin with a few dozen servers and a few hundred SQL Server database, I need to effectively build automated jobs to perform various administrative tasks such as backing up databases. I&#8217;m still new to PowerShell but I am beginning to see how immensely helpful it is to me and my work. I [...]]]></description>
			<content:encoded><![CDATA[<p>As a databases admin with a few dozen servers and a few hundred SQL Server database, I need to effectively build automated jobs to perform various administrative tasks such as backing up databases. I&#8217;m still new to PowerShell but I am beginning to see how immensely helpful it is to me and my work.</p>
<p>I found a good PowerShell script for backing up databases at <a title="Use Powershel to back up all user databases" href="http://blogs.msdn.com/buckwoody/archive/2009/06/25/use-powershell-to-backup-all-user-databases.aspx" target="_blank">this blog location</a>. However, I wanted to change it slightly to accommodate backing up ALL, System, User, or a list of databases. Processing ALL, System, or User is straightforward enough but I had to it was the first time I came up against have to compare a value against a list of values. In SQL you simply use an IN operator with a list of values but I was not sure of how to accomplish the same process in PowerShell.</p>
<p>Here was my problem: the user could supply a list of databases to backup and the backup script has a line with captures all the database objects for that SQL Server instance. I need to backup only those which are in the users list.</p>
<p>I found that the PowerShell <strong>WHERE</strong> clause can use a <strong>-contains</strong> operator which effectively filters the selection for an array. To test the operation I set up a small script to build two arrays and then I piped one array through a WHERE filter of which the results are piped to a ForEach. The ForEach sees only the results of the WHERE which mimics the SQL IN operator.</p>
<p>Run this code in PowerShell to see what I mean.</p>
<pre class="brush: ps">$a = @("db1","db2","db3","db4")
$d = @("db1","db2","db3","db4","db5","db6","db7","db8")
$d | where { $a -contains $_ } | foreach { Write-Host $_ }</pre>
<p><strong>$a</strong> represents the list of database supplied by the user.<br />
<strong>$d</strong> represents the array of databases returned when accessing the Microsoft.SqlServer.Management.Smo.Server object.<br />
I can now back up the user supplied databases within the foreach script block.</p>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:d05e848e-d526-4494-8d76-eea0b3f11e9c" class="wlWriterSmartContent" style="margin: 0px; display: inline; padding: 0px;">del.icio.us Tags: <a rel="tag" href="http://del.icio.us/popular/PowerShell%20Script%20Where%20compare%20list">PowerShell Script Where compare list</a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.webofwood.com/2009/08/04/powershell-where-compare-list/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
