powershell、Invoke RestMethod、Azure表存储、OData-不一致

powershell、Invoke RestMethod、Azure表存储、OData-不一致,powershell,odata,azure-table-storage,Powershell,Odata,Azure Table Storage,最近我第一次遇到azure表存储和odata查询。起初它们看起来很明显,但现在我被困在一个看起来像虫子的东西上。我拥有的是一个表,其中包含一些具有属性的用户。我尝试使用powershell(5.1/7-相同)和Invoke-RestMethod(Invoke-WebREquest相同)通过用户名查询用户。但奇怪的是,它并不是每次都有效!我还使用GUI-MicrosoftAzure存储资源管理器,在那里一切正常。我甚至从GUI复制查询的文本并将其放入代码中,但它是一样的。脚本非常简单: $stor

最近我第一次遇到azure表存储和odata查询。起初它们看起来很明显,但现在我被困在一个看起来像虫子的东西上。我拥有的是一个表,其中包含一些具有属性的用户。我尝试使用powershell(5.1/7-相同)和Invoke-RestMethod(Invoke-WebREquest相同)通过用户名查询用户。但奇怪的是,它并不是每次都有效!我还使用GUI-MicrosoftAzure存储资源管理器,在那里一切正常。我甚至从GUI复制查询的文本并将其放入代码中,但它是一样的。脚本非常简单:

$storageAccount/$accessKey/$headers

$地址= "https://myaccount.table.core.windows.net/users?`$filter=(用户名) “username1”)“调用RestMethod-Method Get-Uri$address-Headers $headers-ContentType“application/json”

问题是它可以与$username1一起使用,但不能与$username2一起使用。如果它对一个用户名有效,它总是对它有效。如果用户名无效,同样适用。按RowKey查询始终有效,并且所需的属性就在那里。我查看了两个用户帐户,它们具有相同的属性,用户名看起来也很相似,但查询对某些用户有效,而对其他用户无效。有什么提示可能是问题以及要调查什么

p、 我可能发现了问题,但没有找到解决办法。当我使用Invoke RestMethod查询表存储时,该命令大约需要6秒钟,并且没有找到任何结果。当我通过Microsoft Azure Storage Explorer使用相同的查询时,大约需要33秒,但找到了结果。所以我认为invokerestmethod不会搜索整个表。更重要的是,我对小桌子没有同样的问题

p、 s.2证明这是故意的。微软表示,这种查询最多只需5秒钟,最多只能查看1000条记录。解决此问题的方法是查看响应头。如果它们包含“延续标记”,则可以在查询的URL中使用这些标记编写另一个查询。如果有人感兴趣的话,这里有。 如果有人在代码方面遇到困难,下面是一个简单的实现:

            $allresults = [System.Collections.Generic.List[object]]::new()
            $resultStorage = Invoke-WebRequest -Method Get -Headers $headersStorage -Uri $addressStorage -ContentType 'application/json'
            $allresults.Add($resultStorage)
            while ($null -ne $resultStorage.headers.'x-ms-continuation-NextPartitionKey') {
                $NextPartitionKey = $resultStorage.Headers.'x-ms-continuation-NextPartitionKey'
                $NextRowKey = $resultStorage.Headers.'x-ms-continuation-NextRowKey'
                $addressStorage = "https://$($storageAccount).table.core.windows.net/$($resource)&NextPartitionKey=$($NextPartitionKey)&NextRowKey=$($NextRowKey)"
                $resultStorage = Invoke-WebRequest -Method Get -Headers $headersStorage -Uri $addressStorage -ContentType 'application/json'
                $allresults.Add($resultStorage)
            }
            $convertedResultsValue = ($allresults.Content | ConvertFrom-Json).Value