Azure Set-AzStorageBlobContent引发异常:路径中存在非法字符

Azure Set-AzStorageBlobContent引发异常:路径中存在非法字符,azure,powershell,azure-storage,Azure,Powershell,Azure Storage,我正在将Azure部署脚本从AzureRM迁移到Az,新模块似乎无法打开文件 有什么想法吗 我试着用正向斜线代替反向斜线; 我甚至从脚本所在的文件夹中调用了它,所以我不需要传递完整的文件名,它会正确地将其解析为完整的名称,但它仍然无法打开它 PS C:\dev\pq\service\scripts\azure\NestedTemplates> Set-AzStorageBlobContent -Container "florin-container" -Context $storageAc

我正在将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
19年2月13日更新:

我在我们更大的脚本套件之外创建了一个非常简单的测试用例场景,可以很容易地重新创建问题。我在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:\>

如果您的
AzureRM
命令工作正常,那么使用
Az
模块运行
AzureRM
命令的最简单方法就是首先执行,然后运行
AzureRM
命令,它也会工作

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

$context = New-AzStorageContext -StorageAccountName "<StorageAccountName>" -StorageAccountKey "xxxxxxx"
Set-AzStorageBlobContent -Container "111" -File "C:\Users\joyw\Desktop\cosmos.json" -Context $context
$context=New-AzStorageContext-StorageAccountName”“-StorageAccountKey“xxxxxxx”
设置AzStorageBlobContent-Container“111”-文件“C:\Users\joyw\Desktop\cosmos.json”-上下文$Context

这是我的powershell模块,你可以检查一下


在阅读了(以上评论的功劳)中的讨论并点击链接后,我能够在我的机器上解决问题

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

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

然后重新启动PowerShell实例。

以上所有解决方案都不适合我。打败它的唯一方法是使用Azure.Storage模块而不是Az.Storage,并设置AzureStorageBlobContent而不是设置AzureStorageBlobContent

因此:

1)
安装模块Azure.Storage-AllowClobber
(如果没有-AllowClobber,则会因为Azure.Profile而失败)

2)
导入模块Azure.Storage


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

JSON文件中的路径只是磁盘路径吗?是。我尝试了不同的方法,相对路径,绝对路径,它正确解析为全名,但无法打开。顺便说一句,同样的部分在AzureRM版本中工作得很好,所以我很自信路径本身没有问题。有可能它不喜欢JSON文件中的逗号或冒号吗?快速的谷歌搜索并没有发现任何重要的东西。作为测试,您是否可以使用一个只有一行的不同JSON文件来查看是否有括号、冒号或逗号使解释器发出吠声?我会尝试,尽管错误消息说“路径中的非法字符”。我假设这是我的文件路径…不熟悉Azure命令,但我猜JSON中有一些不喜欢的东西。以前在自动化JSON配置时遇到过类似的问题,但纯粹从这里猜测我的模块较新:Get Module-ListAvailable目录:C:\Program Files\WindowsPowerShell\modules ModuleType版本名称---------------脚本1.2.1 Az.帐户脚本1.0.1 Az.KeyVault脚本1.1.1 Az.资源脚本1.1.0 Az.Sql脚本1.0.2 Az。Storage@Florinator我看到你加薪了同样的问题。我已经在GitHub中回答了这个问题,需要更多信息。请您在GitHub中关注它好吗?我刚刚尝试了启用AzureRmAlias,但得到了相同的错误。我用一个简化的测试用例更新了我的原始问题。@Florinator这很奇怪。尝试重新安装您的
Az
模块并更改路径,C:\有点特殊。这只有在您控制环境的情况下才能起作用。它不会在构建代理上运行。您是否能够将其与其他Az模块一起使用?
$registryPath = "HKLM:\SOFTWARE\Microsoft\.NETFramework\AppContext"
New-Item -Path $registryPath
New-ItemProperty -Path $registryPath -Name "Switch.System.IO.UseLegacyPathHandling" -Value "false"