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