Microsoft Virtualization Discussions

Remove Snapshot by name


In our environment we sometimes get stale SME snapshots that start with {. 

So here is a little powershell script that will loop through all the filers and remove it.


### Mail "constants"

      $sendMailAs    = "x"

   $recipients    = "X"

       $subjectLine = "GUID LOG"

       $mailMessage = "GUID Report  The Attached Snapshots have been removed from the filers."

       $smtpServer = "X"

       $priority = "high"

### File Constants

    $date = (get-date).toString('dd-MMM-yyyy_h-mm-ss')

    $ext = ".log"

    $outfile = "Exchange_GUID__" + $date + $ext

    $delim = "`t"

Import-Module DataONTAP

$hostfile = "exchange.txt"

gc $hostFile |% {

    $nacontroller = Connect-NaController $_

    Get-NaVol | Get-NaSnapshot -SnapName "{*" | select TargetName,Name,Created,Total,CumulativeTotal | ft @{Expression={$nacontroller};Label="Filer name";Width=20},@{Expression={$_.TargetName};Label="Volume";Width=40},@{Expression={$_.Name};Label="Name";Width=40},@{Expression={$_.Created.ToShortDateString()};Label="Created";Width=12},@{Expression={ConvertTo-FormattedNumber $_.Total DataSize "0.0"};Label="Total";Width=10},@{Expression={ConvertTo-FormattedNumber $_.CumulativeTotal DataSize "0.0"};Label="Cumulative";Width=10} | Out-File -filepath $outfile -append

    get-navol | get-nasnapshot -snapname "{*" | where-object {$_.busy -like "*false*"} | remove-nasnapshot -confirm:$false


## Send Email

Send-MailMessage -To $recipients -From $sendMailAs -Attachments $outfile -Subject $subjectLine -Body $mailMessage -Priority $priority -SmtpServer $smtpServer



Now, i'm not sure its the best way to do this, but it works.    I wanted to ensure we weren't trying to delete busy snaps so I through in $_.busy -like "*false*".   I tried -eq "false" but it wouldn't return anything which was confusing to me .

Now remember i'm very new to powershell so any criticism is welcome.  I didn't know a good way to log in one line and then delete in another so, I had to run the cmdlet again.  Any suggestions for imporvement are welcome.



where-object { $_.busy -eq $false }