У меня есть скрипт, в котором некоторые файлы удаляются ...
VERBOSE: Выполнение операции «Удалить каталог» на цели
\ Name1 \ подпозиция
VERBOSE: Выполнение операции «Удалить каталог» на цели
\ Name1 \ subitem1
VERBOSE: Выполнение операции «Удалить каталог» на цели
\ Name1 \ subitem2
но другие выдают эту ошибку после других подробных сообщений:
Невозможно удалить элемент d: \ temp \ name1.db \ metadata.sqlitedb: процесс
не может получить доступ к файлу metadata.sqlitedb, потому что он используется
другой процесс.
Каталог d: \ temp \ name1.db не может быть удален, поскольку он не пустой.
Как я могу автоматически убить используемый процесс (какой бы он ни был) и попытаться снова удалить элемент, как часть моего сценария выше?
Я попытался обработать предложение из этой темы. Сценарий PowerShell, чтобы проверить приложение, блокирующее файл? , но я думаю, что наши серверы не поддерживают внешние инструменты, поскольку я либо не получаю никаких выходных данных, либо отказываю в доступе ... . Так что я ищу другой вариант, который не требует внешнего инструмента
По сути, ищу что-то подобное в моем сценарии:
$Directory = "d:\temp"
Invoke-Command -Computer $Server -ScriptBlock {
param ($dir, $name)
#Write-Output "dir='$dir', name='$name'"
$f = Get-ChildItem -Path $dir | Where {$_.Name -Match $name} | Select -ExpandProperty FullName
if ($f) {
$f | Foreach {
try
{
Remove-Item $_ -confirm:$false -recurse -Verbose #-WhatIf
}
catch
{
if ($_.Exception.Message -like '*it is being used by another process*')
{ write-host "that process is " $pid + $pname
try{
KILL PROCESS
Remove-Item $_ -confirm:$false -recurse -Verbose #-WhatIf
}
catch
{
$error[0]
}
}
else
{
Write-Host "$($error[0])`r`n" -foregroundcolor magenta -backgroundcolor black
}
}
}
}
else {
Write-Verbose "No file found"
}
} -ArgumentList $Directory, $DB -verbose