Set-AzStorageBlobContent 抛出异常:路径中存在非法字符

Flo*_*tor 2 powershell azure azure-storage

我正在将 Azure 部署脚本从 AzureRM 迁移到 Az,新模块似乎无法打开文件。

有任何想法吗?

我尝试用正斜杠替换反斜杠;我什至从脚本所在的文件夹中调用它,所以我不需要将完整的文件名传递给它,它会正确地将其解析为全名,但仍然无法打开它。

PS C:\dev\pq\service\scripts\azure\NestedTemplates> Set-AzStorageBlobContent -Container "florin-container" -Context $storageAccount.Context -File ApplicationInsights.json
Set-AzStorageBlobContent : Failed to open file C:\dev\pq\service\scripts\azure\NestedTemplates\ApplicationInsights.json: Illegal characters in path..
At line:1 char:1
+ Set-AzStorageBlobContent -Container "florin-container" -Context $stor ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : CloseError: (:) [Set-AzStorageBlobContent], TransferException
    + FullyQualifiedErrorId : TransferException,Microsoft.WindowsAzure.Commands.Storage.Blob.SetAzureBlobContentCommand
Run Code Online (Sandbox Code Playgroud)

2/13/19 更新:

我创建了一个非常简单的测试用例场景,在我们更大的脚本套件之外,可以很容易地重现问题。我在 c:\ 中放置了一个名为 test.json 的文件,它包含一个空的 json 对象,只有花括号,如下面的输出所示。我正在使用 AzureRM 别名方案:

PS C:\> type test.json
{}
PS C:\> type C:\test.json
{}
PS C:\> Enable-AzureRmAlias
PS C:\> $sa = Get-AzureRmStorageAccount -ResourceGroupName florin-rg -Name florinsa
PS C:\> Set-AzureStorageBlobContent -Container florin-container -Context $sa.Context -File test.json -Blob test
Set-AzureStorageBlobContent : Failed to open file C:\test.json: Illegal characters in path..
At line:1 char:1
+ Set-AzureStorageBlobContent -Container florin-container -Context $sa. ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : CloseError: (:) [Set-AzStorageBlobContent], TransferException
+ FullyQualifiedErrorId : TransferException,Microsoft.WindowsAzure.Commands.Storage.Blob.SetAzureBlobContentCommand

PS C:\>
Run Code Online (Sandbox Code Playgroud)

Str*_*low 7

在阅读https://github.com/Azure/azure-powershell/issues/8473(归功于上述评论)的讨论并点击https://blogs.msdn.microsoft.com/jeremykuhne/2016/06的链接后/09/new-net-path-handling-sneak-peek/我能够在我的机器上解决这个问题。

第二个链接的文档“放下一个名为说,powershell.exe.configC:\Windows\System32\WindowsPowerShell\v1.0与下面的内容”。我碰巧已经有了这个文件,所以我将内容添加到了我现有的文件中。

<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false" />
  </runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)

重新启动 PowerShell 后,我现在能够成功执行我的脚本。在我更新到Az模块并删除AzureRm模块后,问题开始了。这有望节省其他人追逐链接的时间。

更新 0

也可以修改注册表来解决问题。

$registryPath = "HKLM:\SOFTWARE\Microsoft\.NETFramework\AppContext"
New-Item -Path $registryPath
New-ItemProperty -Path $registryPath -Name "Switch.System.IO.UseLegacyPathHandling" -Value "false"
Run Code Online (Sandbox Code Playgroud)

然后重新启动 PowerShell 实例。