Remove-Item против [System.IO.File]::Delete()

У меня есть следующий код в Azure Runbook:

$pathToDownloadedBlob = 'C:\depId-20150904032522\SevenZipSharp.dll'
if ((Test-Path $pathToDownloadedBlob) -eq $true)
{
    try
    {
        Remove-Item -Path $pathToDownloadedBlob

    }
    catch
    {
        write-error "Could not delete $pathToDownloadedBlob. - $($error[0])"
        exit
    }
}

Когда я использую Remove-Item, я получаю эту ошибку:

4/7/2015 2:14:14 PM, Error: Remove-Item : The converted JSON string is in bad format.
At DavidTest:45 char:45
+ 
    + CategoryInfo          : InvalidOperation: (System.Unauthor... Boolean force):ErrorRecord) [Remove-Item], 
InvalidOperationException
    + FullyQualifiedErrorId : JsonStringInBadFormat,Microsoft.PowerShell.Commands.RemoveItemCommand

Когда я вместо этого использую [System.IO.File]::Delete($using:path), я получаю эту ошибку:

4/7/2015 2:22:48 PM, Error: Exception calling "Delete" with "1" argument(s): "Access to the path 'C:\Deployment\SevenZipSharp.dll' is denied."
At DavidTest:46 char:46
+ 
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : UnauthorizedAccessException

Я знаю, что у меня нет прав на удаление файла. Однако почему он жалуется на строку JSON, когда я использую Remove-Item?

РЕДАКТИРОВАТЬ: обратите внимание, что это происходит только в службе автоматизации Azure. Однако я не смог воспроизвести это в Powershell ISE локально, потому что у меня есть разрешение на файлы, которые я хочу удалить.


ОБНОВЛЕНИЕ: я только что понял, что это происходит только с файлами .dll. Если я пытаюсь удалить файл .7z, он работает нормально.


person David Klempfner    schedule 07.04.2015    source источник


Ответы (1)


Я полагаю, что это связано с сериализацией/десериализацией объекта, передаваемого между контекстом рабочего процесса PowerShell и действием рабочего процесса InlineScript, которое по умолчанию выполняется в отдельном процессе.

Вы всегда передаете объект [System.String] или иногда передаете объект [System.IO.FileInfo]? Если последнее, то вы, вероятно, захотите сослаться на свойство FullName, а не передавать сам объект в Remove-Item.

Я не уверен на 100%, что это то, с чем вы столкнулись, но это стоит обсудить.

Кстати, рекомендуется всегда явно указывать параметры, чтобы другие люди понимали, что вы делаете. Ваш вызов Remove-Item не включает параметр -Path по имени, потому что он позиционно равен 0. Конечно, это нехорошо принимать как должное, когда вы просите о помощи. Лучше многословно.

Надеюсь, это хоть немного поможет. Кстати, эта проблема уникальна для модулей Runbook службы автоматизации Azure или она существует и в локально выполняемых рабочих процессах PowerShell?

Изменить: этот код отлично работает у меня локально.

workflow test {
    $Path = 'C:\dsc\srv01.xml';
    InlineScript { Remove-Item -Path $using:Path; };
}

test
person Trevor Sullivan    schedule 07.04.2015
comment
да, но вы имитировали отсутствие разрешения на этот файл? - person David Klempfner; 07.04.2015
comment
и вы проверили это локально. У меня тоже локально работает. Но не на Лазурном. - person David Klempfner; 09.04.2015