2015-04-07 109 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上。 –