【问题标题】:Set-AzStorageBlobContent throws exception: Illegal characters in pathSet-AzStorageBlobContent 引发异常:路径中有非法字符
【发布时间】:2019-06-28 14:00:02
【问题描述】:

我正在将 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

2/13/19 更新:

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

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:\>

【问题讨论】:

  • JSON文件中的路径只是磁盘路径吗?
  • 是的。而且我尝试了不同的方式,相对路径,绝对路径,它正确解析为全名,但无法打开它。顺便说一句,同一部分在 AzureRM 版本上运行良好,所以我相当确信路径本身没有任何问题。
  • 它可能不喜欢 JSON 文件中的逗号或冒号吗?快速谷歌并没有发现任何重要的东西。作为测试,您能否使用仅包含一行的不同 JSON 文件来查看括号、冒号或逗号是否使解释器吠叫?
  • 我会尝试,尽管错误消息显示“PATH 中有非法字符”。我以为这是我的文件路径...
  • 不熟悉 Azure 命令,但我猜 JSON 中有一些它不喜欢的东西。之前在自动化 JSON 配置方面遇到过类似问题,但纯粹是从这里猜测

标签: azure powershell azure-storage


【解决方案1】:

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

第二个链接文档说“在C:\Windows\System32\WindowsPowerShell\v1.0 中删除一个名为powershell.exe.config 的文件,内容如下”。我碰巧已经有了该文件,所以我将内容添加到我现有的文件中。

<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false" />
  </runtime>
</configuration>

重新启动 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"

然后重新启动 PowerShell 实例。

【讨论】:

  • 这只能在你控制环境的情况下工作。它不会在构建代理上运行。
【解决方案2】:

如果您的AzureRM 命令运行良好,使用Az 模块运行AzureRM 命令的最简单方法是首先执行Enable-AzureRmAlias,然后运行您的AzureRM 命令,它也可以工作。

另外,我在本地测试了Az 命令,它应该可以正常工作。

$context = New-AzStorageContext -StorageAccountName "<StorageAccountName>" -StorageAccountKey "xxxxxxx"
Set-AzStorageBlobContent -Container "111" -File "C:\Users\joyw\Desktop\cosmos.json" -Context $context

这些是我的 powershell 模块,你可以查看它们。

【讨论】:

  • 我的模块较新:Get-Module -ListAvailable 目录:C:\Program Files\WindowsPowerShell\Modules ModuleType 版本名称 ---------- -------- - ---- 脚本 1.2.1 Az.Accounts 脚本 1.0.1 Az.KeyVault 脚本 1.1.1 Az.Resources 脚本 1.1.0 Az.Sql 脚本 1.0.2 Az.Storage
  • @Florinator 我看到你在github.com/Azure/azure-powershell/issues/8473 中提出了同样的问题。我已经在 GitHub 上回复了这个问题,需要更多信息。你能在 GitHub 上关注它吗?
  • 我刚刚尝试了 Enable-AzureRmAlias,我得到了同样的错误。
  • 我用一个简化的测试用例更新了我的原始问题。
  • @Florinator 这很奇怪。尝试重新安装您的Az 模块并更改路径,C:\ 有点特别。
【解决方案3】:

以上解决方案都不适合我。击败它的唯一方法是使用 Azure.Storage 模块而不是 Az.Storage,并使用 Set-AzureStorageBlobContent 而不是 Set-AzStorageBlobContent

所以:

1) Install-Module Azure.Storage -AllowClobber(没有 -AllowClobber 会因为 Azure.Profile 而失败)

2) Import-Module Azure.Storage

3) 在脚本中将Set-AzStorageBlobContent 命令替换为Set-AzureStorageBlobContent

【讨论】:

  • 您可以将它与其他 Az 模块一起使用吗?
猜你喜欢
  • 2022-12-17
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多