2015-04-07 149 views
1

我有在Azure中運行手冊下面的代碼:刪除-項目Vs的[有System.IO.File] ::刪除()

$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 

我知道我沒有權限刪除文件。 但是,當我使用Remove-Item時,它爲什麼會抱怨JSON字符串?編號: 注意這隻發生在Azure自動化。但是,我並沒有真正能夠在本地複製Powershell ISE中的這一點,因爲我有權刪除我希望刪除的文件。


更新:我剛剛意識到這隻發生在.dll文件中。如果我嘗試刪除.7z文件,它工作正常。

回答

1

我會想象這是由於在PowerShell工作流上下文和InlineScript工作流活動之間傳遞的對象的序列化/反序列化,InlineScript工作流活動默認在單獨的進程中運行。

你總是在傳遞一個[System.String],或者你有時傳遞一個[System.IO.FileInfo]對象嗎?如果是後者,那麼你可能會想引用FullName屬性,而不是將對象本身傳遞給Remove-Item

我不是100%確定這是你遇到的情況,但值得討論。順便說一下,作爲一個最佳實踐,總是明確地命名參數,讓其他人明白你在做什麼。您撥打Remove-Item的電話不包含名稱爲-Path的參數,因爲它的位置爲0.當然,在尋求幫助時,這不是理所當然的好事。最好是冗長的。

希望這有助於至少一點。順便說一句,這個問題是Azure自動化Runbook特有的,還是存在於本地執行的PowerShell工作流中?

編輯:此代碼似乎在本地工作得很好。

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

test 
+0

是的,但你模擬沒有該文件的權限? –

+0

並且您在本地進行了測試。它對我來說在當地也很好。但不在Azure上。 –