Powershell: specifiek stuk text uit string halen.

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • mitch2kbe
  • Registratie: Januari 2008
  • Laatst online: 21-08 11:46
Hi,

ik ben bezig om via Powershell data te halen uit een storage device. Ik wil weten wat de status is, en hoeveel vrije diskruimte er over is.

Ik heb een script gemaakt dat via de CLI client een connectie maakt naar het apparaat, een bepaald commando uitvoert, en vervolgens het resultaat in een variable duwt. De inhoud van de variable is als volgt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
   Name:              TIER3

      Status:         Optimal
      Capacity:       14.550 TB
      Current owner:  Controller in slot A,B

      Quality of Service (QoS) Attributes

         RAID level:                                        6

         Drive media type:                                  Hard Disk Drive

         Drive interface type:                              Serial Attached SCSI
 (SAS)
         Enclosure loss protection:                         No

         Secure Capable:                                    No

         Secure:                                            No

         T10 PI (Protection Information) (T10 PI) capable:  No

         T10 PI enabled logical drive present:              No



      Total Logical Drives:          7
         Standard logical drives:    7
         Repository logical drives:  0
         Free Capacity:              3,480.289 GB

      Associated drives - present (in piece order)
      Total drives present: 10

         Enclosure     Slot
         99            1
         99            2
         99            3
         99            4
         99            5
         99            6
         99            7
         99            8
         99            10
         99            9


Ik zou nu de value achter "Status: " en achter "Free Capacity: " in een aparte variable willen steken (om zo verder te verwerken in m'n script). Maar ik heb geen enkel idee hoe ik er aan moet beginnen.

Ik heb reeds rondgezocht, maar kan enkel voorbeelden vinden om naar een specifiek woord te zoeken met -eq of -match, of via splits met een delimiter,, maar niet naar een value die erachter komt.
Ik heb het idee dat ik de locatie/index moet bepalen van "Status", en vervolgens links en rechts trimmen. Maar ik weet niet hoelang het woord/de woorden is/zijn die achter status komen, dus heb ik kans dat ik maar een gedeelte heb (of een deel van de volgende lijn).

Iemand een tip hoe ik dit klaarkrijg, of naar wat ik exact moet zoeken?

Thanks!

Acties:
  • 0 Henk 'm!

  • Question Mark
  • Registratie: Mei 2003
  • Laatst online: 11:56

Question Mark

Moderator SSC/WOS

F7 - Nee - Ja

Ik heb even voor mijn gemak je variable in een txt-file gestopt en het volgende commando gedraait:

code:
1
select-string file.txt -Pattern "free capacity", "status"


De output wordt dan:

code:
1
2
file.txt:3:      Status:         Optimal
file.txt:30:         Free Capacity:              3,480.289 GB


Test even of je ook rechtstreeks select-string kunt toepassen op een variable, maar ik verwacht van wel. :)

[ Voor 6% gewijzigd door Question Mark op 19-12-2014 14:55 ]

MCSE NT4/2K/2K3, MCTS, MCITP, CCA, CCEA, CCEE, CCIA, CCNA, CCDA, CCNP, CCDP, VCP, CEH + zwemdiploma A & B


Acties:
  • 0 Henk 'm!

  • mitch2kbe
  • Registratie: Januari 2008
  • Laatst online: 21-08 11:46
Thanks voor je input! Ik wist niet dat een select string de volledige lijn neemt. Mits wat aanpassing/pipe is het als volgt gelukt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#status
#-----------------

$lookupword = "Status: "

# Get the array from CLI result
$lookupresult = $cliresult | select-string -pattern $lookupword -casesensitive

#Remove double spaces
while ($lookupresult -match "  "){
    $lookupresult = $lookupresult -replace "  "," "
    }

#Remove part
$lookupresult = $lookupresult -replace $lookupword,""

#Define result
$arraystatus = $lookupresult

echo $arraystatus


Thanks!

Acties:
  • 0 Henk 'm!

  • Squ1zZy
  • Registratie: April 2011
  • Niet online
Waar is het zoeken voor 2 spaties voor om die te vervangen met een enkele spatie?

Dit kan toch ook makkelijker?

$lookupresult.Replace(" "," ")

Kijk ook even TrimStart() en TrimEnd(). Voor jou had denk ik Trim() al genoeg geweest.

Acties:
  • 0 Henk 'm!

  • brid
  • Registratie: Januari 2001
  • Laatst online: 29-07-2024

brid

Onze excuses voor het ongemak

Het probleem wat hij heeft 'opgelost' is dat na een -replace "__","_" er nog steeds dubbele spaties zijn.
Aangezien -replace met een regex werkt kun je dit op lossen door de juiste regex te gebruiken
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$Var -replace "\s+"," "

PS G:\> $test = "   sdfsdfsd:         sadfdas"

Hier blijven spaties over
PS G:\> $test -replace "  "," "  
  sdfsdfsd:     sadfdas

oeps hier gaat iets te veel weg
PS G:\> $test -replace "\W+"," "  
 sdfsdfsd sadfdas

Deze klopt wel
PS G:\> $test -replace "\s+"," "  
 sdfsdfsd: sadfdas


\W is alle non-words en dus iets te veel, \s geeft wel de juiste resultaten aangezien dit white-spaces zijn

Als ik je verhaal goed begrijp is dit 1 variable met linefeeds.
Dan werkt dit ook:
code:
1
2
3
4
5
6
7
8
9
10
11
12
PS G:\> $test = "      Status:         Optimal
      Capacity:       14.550 TB"

PS G:\> $regel = [regex]::match($test,"Status:\s+.*").Value

PS G:\> $status = ([regex]::match($regel,"\s.*").Value).trim()

PS G:\> $regel
Status:         Optimal

PS G:\> $status
Optimal


handige site voor als je met regex bezig bent ode regular expresions zoals ze heten
http://www.zerrouki.com/p...heet-regular-expressions/

[ Voor 44% gewijzigd door brid op 06-02-2015 15:46 ]

DIY NAS, Hoofd PC
Unchain your pc/laptop, buy a SSD!!!!!