Remove-Item Vs [System.IO.File]::Delete()

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

$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 Automation. Однако я не смог воспроизвести это в Powershell ISE локально, потому что у меня есть разрешение на файлы, которые я хочу удалить.


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

1 ответ

Решение

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

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

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

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

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

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

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

test
Другие вопросы по тегам