मैं पॉवरशेल और हैश टेबल में सरणियों के बारे में पढ़ रहा हूं, मैं एक सरणी के मूल कामकाज को जानता हूं और सरणी के भीतर आइटम प्राप्त करने के लिए फ़ोरैच लूप का उपयोग कैसे करता हूं, यहां मेरा चालान थोड़ा अलग है। मैं एक स्क्रिप्ट के लिए एक बहु आयाम सरणी को भुगतान करना चाहता हूं, और सरणी के भीतर निहित वस्तुओं को संसाधित करना चाहता हूं।

मेरा सेटअप क्या है।

 $x = (1,"Server1",3,1),(4,"Server2",6,2),(3,"Server3",4,3)
 $k = 'serverid','servername','locationid','appid'    # key names correspond to data positions in each array in $x
 $h = @{}
      
      
 For($i=0;$i -lt $x[0].length; $i++){
     $x |
         ForEach-Object{
             [array]$h.($k[$i]) += [string]$_[$i]
         }
               
               
 } 

मैं क्या हासिल करने की कोशिश कर रहा हूं?

मैं powerhell के भीतर एक डेटाबेस तालिका की संरचना को प्राप्त करने की कोशिश कर रहा हूँ। तो सचमुच प्रत्येक सरणी वस्तु को एक पंक्ति के रूप में मानते हुए।

तो उदाहरण के लिए

(1, "सर्वर 1", 3,1, (4, "सर्वर2", 6,2), (3, "सर्वर3", 4,3)

नीचे की तरह एक तालिका के रूप में सोचा जा सकता है

छवि विवरण यहां दर्ज करें

मैं फिर नीचे दिए गए उदाहरण के समान मान प्राप्त करने के लिए सरणी में प्रत्येक आइटम के लिए लूप करना चाहता हूं:

[0].serverid = 1, [0].servername = server1, [0].locationid = 3, [0].applicationID = 1

[1].serverid = 4, [1].servername = server2, [1].locationid = 6, [1].applicationID = 2

मैंने क्या किया है?

$x = (1,"Server1",3,1),(4,"Server2",6,2),(3,"Server3",4,3)
 $k = 'serverid','servername','locationid','appid'    # key names correspond to data positions in each array in $x
 $h = @{}


 For($i=0;$i -lt $x[0].length; $i++){
     $x |
         ForEach-Object{
             [array]$h.($k[$i]) += [string]$_[$i]
         }


 } 

$x


for ($i = 0; $i -lt $x.Count; $i++)
{
    $myserverid = $x[$i][0]
    $myservername = $x[$i][1]
    $mylocationid = $x[$i][2]
    $myappid = $x[$i][3]

    write-host $myserverid
}
 

मुद्दे

अगर मैं निम्नलिखित $x = (1, "सर्वर1", 3,1) सेट करता हूं, तो लूप कुछ गलत है, इसलिए मुझे लगता है कि दृष्टिकोण गलत है (एक से अधिक आइटम काम करता है यानी $x = (1,"सर्वर 1 ",3,1),(4,"सर्वर2",6,2),(3,"सर्वर3",4,3))। लूप केवल तभी काम करता है जब आपके पास सरणी के भीतर एक से अधिक आइटम हों, इसलिए मैं लूप के काम करने के तरीके की फिर से जांच क्यों करना चाहता हूं।

अग्रिम में धन्यवाद

1
user5544 17 पद 2020, 01:38
नीचे दिए गए उत्तर के लिए धन्यवाद, परीक्षण करते समय मैंने "," जोड़कर यूनरी ऑपरेटर का उपयोग करने में कोई समस्या देखी, यह एक चर के अंदर उपयोग किए जाने पर काम करता है, लेकिन उदाहरण की तरह फ़ाइल में पास होने पर काम नहीं करता है। test.ps1 param ([array[]]$servers) for ($i = 0; $i -lt $servers.Count; $i++) { $myserverid = $servers[$i][0] $myservername = $servers[$i][1] $mylocationid = $servers[$i][2] $myappid = $servers[$i][3] write-host " $myserverid and $myservername and $mylocationid and $myappid" } .\tester.ps1 -servers ,(1,'Server1',3,1)` नामक एक फ़ाइल बनाएँ विफल रहता है
 – 
user5544
18 पद 2020, 00:05
नेस्टेड सरणी को तर्क के रूप में पारित करने के लिए, आपको इसे (...) में समग्र रूप से लपेटना होगा: .\tester.ps1 -servers (,(1,'Server1',3,1))
 – 
mklement0
21 पद 2020, 17:11

1 उत्तर

सबसे बढ़िया उत्तर

आपका दृष्टिकोण एक नेस्टेड (दांतेदार) सरणी पर निर्भर करता है: यानी, आपके पास उप-सरणी की एक सरणी है, जिनमें से प्रत्येक उन मानों के टपल का प्रतिनिधित्व करता है जिन्हें आप गुणों को निर्दिष्ट करना चाहते हैं।

यदि केवल एक उप-सरणी है, तो आपको नेस्टेड सरणी स्पष्ट रूप से बनानी होगी, , के एकात्मक रूप का उपयोग करके सरणी कंस्ट्रक्टर ऑपरेटर:

# Construct a 1-element array that contains the 4-element subarray.
$x = , (1,"Server1",3,1)

दो या अधिक, उप-सरणी के साथ, आप निहित रूप से एक नेस्टेड सरणी प्राप्त करते हैं:

# Construct a 3-element array, each element of which contains a 4-element subarray.
$x = (1,"Server1",3,1), (4,"Server2",6,2), (3,"Server3",4,3)

ध्यान दें कि PSv5+ में आप अपनी समस्या का समाधान करने के लिए एक कस्टम वर्ग का उपयोग कर सकते हैं:

class Custom {
  [int] $serverid; [string] $servername;[int] $locationid; [int] $appid
  Custom($propValueArray) {
    $this.serverid = $propValueArray[0]; $this.servername = $propValueArray[1]; $this.locationid = $propValueArray[2]; $this.appid = $propValueArray[3]
  }
}

# Use an array cast to construct [Custom] instances.
# Note the need for (...) around the array, because casts have high
# precedence in PowerShell.
[Custom[]] ((1,"Server1",3,1), (4,"Server2",6,2), (3,"Server3",4,3))

यह प्रसंस्करण के लिए अनुमति देगा जैसे:

# Construct all objects
$objects = [Custom[]] ((1,"Server1",3,1), (4,"Server2",6,2), (3,"Server3",4,3))

# Process each object.
foreach ($object in $objects) {
   ($myserverid = $object.serverid) # assign a property to a var; `()` also outputs
   # ...
}
1
mklement0 20 पद 2020, 16:59