Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
PowerShell command to delete a file, if possible immediately, and if it is in use at the next boot.
param(
[parameter(Mandatory=$true)]
[string] $path
)
# the code below has been used from
# https://blogs.technet.com/b/heyscriptingguy/archive/2013/10/19/weekend-scripter-use-powershell-and-pinvoke-to-remove-stubborn-files.aspx
# with inspiration from
# http://www.leeholmes.com/blog/2009/02/17/moving-and-deleting-really-locked-files-in-powershell/
# and error handling from
# https://blogs.technet.com/b/heyscriptingguy/archive/2013/06/25/use-powershell-to-interact-with-the-windows-api-part-1.aspx
Add-Type @'
using System;
using System.Text;
using System.Runtime.InteropServices;
public class Posh
{
public enum MoveFileFlags
{
MOVEFILE_DELAY_UNTIL_REBOOT = 0x00000004
}
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
static extern bool MoveFileEx(string lpExistingFileName, string lpNewFileName, MoveFileFlags dwFlags);
public static bool MarkFileDelete (string sourcefile)
{
return MoveFileEx(sourcefile, null, MoveFileFlags.MOVEFILE_DELAY_UNTIL_REBOOT);
}
}
'@
$path = (Resolve-Path $path -ErrorAction Stop).Path
try {
Remove-Item $path -ErrorAction Stop
} catch {
$deleteResult = [Posh]::MarkFileDelete($path)
if ($deleteResult -eq $false) {
throw (New-Object ComponentModel.Win32Exception) # calls GetLastError
} else {
# write-host "(Delete of $path failed: $($_.Exception.Message) Deleting at next boot.)"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment