AzCopy 同步命令失败



我正在发出以下命令:

azcopy sync "D:ReleasesTestMyApp" "http://server3:10000/devstoreaccount1/myapp?sv=2019-02-02&st=2020-06-24T03%3A19%3A44Z&se=2020-06-25T03%3A19%3A44Z&sr=c&sp=racwdl&sig=REDACTED"

。我收到此错误:

解析用户给出的输入时出错。失败,出现错误 无法推断源"D:\版本\测试\我的应用"/目标"http://server3:10000/devstoreaccount1/myapp?sv=2019-02-02&st=2020-06-24T03%3A19%3A44Z&se=2020-06-25T03%3A19%3A44Z&sr=c&sp=racwdl&sig=-REDACTED-

我本来以为我的消息来源很清楚。

任何人都可以看到我的语法有什么问题吗?

我相信您在使用 azcopy 时遇到了一个问题,即它不支持本地模拟器(至少对于同步命令(。Github上有一个悬而未决的问题:https://github.com/Azure/azure-storage-azcopy/issues/554。

基本上问题来自以下code行,在存储模拟器 URL 的情况下,它将位置返回为Unknown

func inferArgumentLocation(arg string) common.Location {
if arg == pipeLocation {
return common.ELocation.Pipe()
}
if startsWith(arg, "http") {
// Let's try to parse the argument as a URL
u, err := url.Parse(arg)
// NOTE: sometimes, a local path can also be parsed as a url. To avoid thinking it's a URL, check Scheme, Host, and Path
if err == nil && u.Scheme != "" && u.Host != "" {
// Is the argument a URL to blob storage?
switch host := strings.ToLower(u.Host); true {
// Azure Stack does not have the core.windows.net
case strings.Contains(host, ".blob"):
return common.ELocation.Blob()
case strings.Contains(host, ".file"):
return common.ELocation.File()
case strings.Contains(host, ".dfs"):
return common.ELocation.BlobFS()
case strings.Contains(host, benchmarkSourceHost):
return common.ELocation.Benchmark()
// enable targeting an emulator/stack
case IPv4Regex.MatchString(host):
return common.ELocation.Unknown()//This is what gets returned in case of storage emulator URL.
}
if common.IsS3URL(*u) {
return common.ELocation.S3()
}
}
}
return common.ELocation.Local()
}

尝试从本地计算机同步到 Azure Blob 存储时,我遇到了同样的问题。

这是我正在运行的命令:

azcopy sync "C:AzureStorageTestmy-app*" "https://myapptest.z16.web.core.windows.net/$web"

但是我得到了以下错误:

信息:您提供的参数是源:"c:\AzureStorageTest\my-app",类型为"本地",目标:"https://本地类型的 myapptest.z16.web.core.windows.net/'

信息:根据提供的参数,无法自动找到有效的源-目标组合。请 检查您提供的参数。 如果正确,请使用 - 指定确切的源和目标类型 - -从-到开关。有效值是 BlobLocal、LocalBlob 等形式的两个单词阶段。 使用单词"Blob"表示 Blob St orage,"本地"表示本地文件系统,"File"表示 Azure 文件存储,"BlobFS"表示 ADLS Gen2。如果您需要组合 尚不支持,请在 AzCopy GitHub 问题列表中记录问题。

解析用户给出的输入时出错。失败,出现错误 无法推断源"C:\AzureStorageTest\my-app"/目的地"https://myapptest.z16.web.core.windows.net.z16.web.core.windows.net/"。 PS C:\Users\promise> azcopy sync "C:\AzureStorageTest\my-app" "https://myapptest.z16.web.core.windows.net.z16.web.core.window s.net/$web"-from-to localblob 错误:未知速记标志:"f"在 -from-to 中

这是我如何解决它的方法

我缺少 Blob 存储位置末尾的?[SAS]参数。此外,在撰写本文时,azccopy sync命令似乎不支持--from-to switch。所以取而代之的是:

azcopy sync "C:AzureStorageTestmy-app" "https://myapptest.z16.web.core.windows.net/$web"

我有这个:

azcopy sync "C:AzureStorageTestmy-app" "https://myapptest.blob.core.windows.net/%24web?[SAS]" --recursive

  1. 格式为azcopy sync "/path/to/dir" "https://[account].blob.core.windows.net/[container]/[path/to/directory]?[SAS]" --recursive.你只需要修改"/path/to/dir"[account][container]/[path/to/directory]。其他一切都保持原样。
  2. 我的实际 Blob 存储位置是 https://myapptest.blob.core.windows.net/$24web,但我使用了 https://myapptest.blob.core.windows.net/%24web,因为使用时$会引发一些错误,因此使用了%24
  3. 不要像我那样使用 blob 网站地址,这https://myapptest.z16.web.core.windows.net/让我对很多错误感到沮丧,而是使用 blob 存储地址https://myapptest.blob.core.windows.net
  4. 在此目录同步操作中已推断出--recursive标志,因此您可以考虑将其省略。为了清楚起见,我把它放了。

就这样。

我希望这有帮助

好吧,经过多次尝试,我终于能够使用Azurite和PowerShell来工作。很明显,AzureCLI 和 AzCopy 都没有在仿真下经过很好的测试。

下面是可以从管道调用的粗略脚本:

[CmdletBinding()]
param(
[Parameter(Mandatory)][string] $Container,
[Parameter(Mandatory)][string] $Source
)
$Context = New-AzureStorageContext -Local
$BlobNames = Get-AzureStorageBlob -Context $Context -Container $Container | % { $_.Name }
$FilesToSync = gci $Source* -Include RELEASES, Setup.exe
$Packages = gci $Source -Filter *.nupkg
$Packages | % {
If (!($BlobNames.Contains($_.Name))) {
$FilesToSync += $_
}
}
$FilesToSync | Set-AzureStorageBlobContent -Context $Context -Container $Container -Force

请注意,这是针对我的Squirrel部署(*.nupkg,RELEASES,Setup.exe(高度定制的,因此一个人会希望根据自己的环境进行相应的调整。

可以使用计划任务将 Azurite 设置为始终开启,以每小时运行以下命令:

powershell -command "Start-Process azurite-blob.cmd -PassThru -ArgumentList '--blobHost 0.0.0.0'"

该参数将 Azurite 设置为侦听任何 IP,以便可以从网络上的其他计算机访问它。我在端口 10000-10002 的防火墙上打了一个洞。

请注意将任务设置为在用于安装 Azurite 的同一帐户下运行,否则任务将无法看到azurite-blob.cmd(它在%AppData%npm中,在安装过程中添加到PATH(。

命令行需要 --recursive 选项。请参阅 https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-blobs?toc=/azure/storage/blobs/toc.json

最新更新