これがXMLです。サイトIDを探しています。
<result created="2018-10-13T13:11:18-05:00" host="redacted" status="OK">
<items>
<site>
<siteid>399700</siteid>
<name>
<![CDATA[ Warehouse ]]>
</name>
<connection_ok>1</connection_ok>
</site>
<site>
<siteid>547401</siteid>
<name>
<![CDATA[ Monterey Park ]]>
</name>
<connection_ok>1</connection_ok>
</site>
</items>
</result>
探しているデータを取得するには、最初にクライアントIDのXMLを反復処理する必要があります。次に、クライアントIDを使用して各クライアントのサイトIDを見つけることができます。一部のクライアントには複数のサイトがあります。
クライアントは正しく取得されますが、より適切な用語がないため、サイトは圧縮されています。
結果:
クライアントID :12345サイトID:9876543210
サイトIDは2つの個別の番号である必要があります:98765 43210
これが私が使っている2つの関数です:
$ClientsIDs = @()
$SiteIDs = @()
function Get-Clients() {
$clientdata = Invoke-RestMethod -Uri ($baseurl + $lc)
$clientid = $clientdata.result.items.client.clientid
$Script:ClientsIDs += $clientid
Write-Output("Client ID: " + $ClientsIDs)
}
function Get-Sites() {
foreach ($id in $Global:ClientsIDs) {
$sitedata = Invoke-RestMethod -Uri ($baseurl + $ls + $id)
$siteid = $sitedata.result.items.site.siteid
$SiteIDs += $siteid
}
Write-Output("Site ID: " + $SiteIDs)
}
Get-Clients
Get-Sites
(URLのみが表示されていません。sはWrite-Output
、データが正しく収集されていることを確認するためだけのものです。最終的には削除されます。)
を$sitedid
配列に正しく保存するにはどうすればよいですか?
tl; dr
コードをリファクタリングすることをお勧めします。これにより、問題が回避され、より効率的で、より優れたカプセル化が提供されます。
function Get-Sites() {
# Note: Also consider passing the parent-scope
# $ClientsIDs, $baseurl, $ls variables as *parameters* instead.
foreach ($id in $ClientsIDs){
$sitedata = Invoke-RestMethod -Uri ($baseurl + $ls + $id)
# Implicitly output each site ID, which by
# virtue of being inside a foreach loop outputs
# all of them as an array.
$sitedata.result.items.site.siteid
}
}
# If you wanted to interpret the IDs as *numbers*, you
# could use type [int[]], for instance
[array] $SiteIDs = Get-Sites
あなたがしようとしたものを:
に割り当て $SiteIDs
ずにスコープ修飾子 script
($script:SiteIDs
)、あなたが誤って作成しているローカル $SiteIDs
あなたの内部変数Get-Sites
の関数を。
スコープが親スコープの変数を参照しますが、直接割り当てることはできません。割り当てによって作成されているローカルコピーは、親スコープから同じ名前の変数の型(および値)を継承します(この回答を参照してください)。PowerShellでのスコープの詳細をご覧ください)。$SiteIDs
$SiteIDs
本当にスクリプトスコープ内の配列である場合、ローカルコピーも配列を作成しますが、それでもスクリプトスコープ内の元の配列は変更されません。
$SiteIDs
あなたの場合、サイトIDの文字列連結が含まれることになったという事実は、実際のコードがスクリプトスコープに変数を作成しないか、配列()$SiteIDs
@()
ではなく文字列型であるということ+=
を示唆しています。[string]
タイプされた、または以前に存在しなかった変数へのRHSとしての文字列は、単純な文字列連結を実行します(変数が存在しなかった場合、デフォルトで空の文字列になる既存の値にRHSを直接追加します)。
即時修正は次のようになります。
それ$SiteIDs = @()
がスクリプトスコープで本当に定義されていること、つまり配列として定義されていることを確認してください。
意図したとおり、script-scope変数を直接変更$SiteIDs += $siteid
する$script:SiteIDs += $siteid
ようにに変更します。
とはいえ、一般に、スコープの境界を越えて変数を参照することは避けたほうがよいでしょう。上部に示されているように、カプセル化を改善するためにパラメーターとローカル変数を使用してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加