Powershell - Manier uitlezen variabele

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • technoaddict
  • Registratie: Juni 2006
  • Laatst online: 11:32
Hoi,
Sorry, ik ben geen scripter, maar hoop hier het laatste zetje te krijgen tot een werkend script.
Het is een klein stukje script

$Homefolders = Get-ChildItem -Path '\\examp-fs01\d$\home' –Directory | select name

foreach($homef in $Homefolders) {
"{0:N2}" -f ( (get-childitem "\\examp-fs01\d$\$homef\Documents\pwrmenu\UserPref" | Measure-Object -sum -property Length ).Sum / 1MB )
}

Als ik bovenstaand uitvoer krijg ik het volgende

get-childitem : Cannot find path '\\examp-fs01\d$\@{Name=foldernaam}\Documents\pwrmenu\UserPref

Hij leest dus de variabele uit en voert de Foreach ook uit. Maar zet "@{Name=" voor de foldernaam.
Why? En kan ik hier omheen? Ik heb geprobeerd om met -replace dat stukje tekst te vervangen door "" (nog voor dat ik de variabele uitlees), maar krijg het niet voor elkaar.

Het is dan wel zo dat als ik de variabele uitlees ik bovenaan zie staan Name, en dan daaronder in een lange lijst de foldernamen.

Any help. ? Thnx!

[ Voor 7% gewijzigd door technoaddict op 23-10-2015 16:33 ]


Acties:
  • +1 Henk 'm!

  • HMS
  • Registratie: Januari 2004
  • Laatst online: 21-08 23:06

HMS

Vanaf de PS commandline kan ik alle namen van de huidige map op deze manier printen:

code:
1
Get-ChildItem | % { $_.Name }


% is ForEach ;)
_ is de iteratie variabele

[ Voor 8% gewijzigd door HMS op 23-10-2015 16:40 ]


Acties:
  • 0 Henk 'm!

  • technoaddict
  • Registratie: Juni 2006
  • Laatst online: 11:32
Zie je bericht net. Ben nu echter in een afsluit modus. Zal er dit weekend misschien naar kijken, en anders maandag :) (ik weet het, was een beetje laat met dit Topic)

[ Voor 17% gewijzigd door technoaddict op 23-10-2015 16:42 ]


Acties:
  • +1 Henk 'm!

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

brid

Onze excuses voor het ongemak

PowerShell:
1
$Homefolders = Get-ChildItem -Path '\\examp-fs01\d$\home' -Directory | select name

Kun je ook vervangen door:
PowerShell:
1
$Homefolders = Get-ChildItem -Path '\\examp-fs01\d$\home' -Directory | select -expandproperty name

Dan krijg je netjes een array met strings terug en geen array met objecten die de property name bevatten

PowerShell:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
PS C:\Users\brid> $test = Get-ChildItem e:\temp -Directory | select -ExpandProperty name
PS C:\Users\brid> $test[0].GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object


PS C:\Users\brid> $test = Get-ChildItem e:\temp -Directory | select name
PS C:\Users\brid> $test[0].GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    PSCustomObject                           System.Object


Je script heeft trouwens alleen maar een rij cijfers terug, daar kun je niet zo heel veel mee
Nette screen output
PowerShell:
1
2
"$homef {0:N2} MB" -f ( (get-childitem "\\examp-fs01\d$\$homef\Documents\pwrmenu\UserPref" | Measure-Object -sum -property Length ).Sum / 1MB )
}


Netjes voor een CSV kan dit voor je Foreach
PowerShell:
1
$Result = @() #init array


En dit erin
PowerShell:
1
2
3
4
5
#vullen object
$object = New-Object -TypeName PSObject
$object | Add-Member -MemberTypeNoteProperty -Name User -Value $homer
$object | Add-Member -MemberTypeNoteProperty -Name Size -Value ( (get-childitem "\\examp-fs01\d$\$homef\Documents\pwrmenu\UserPref" | Measure-Object -sum -property Length ).Sum / 1MB )
$result += $object #object toevoegen aan array


Daarna kun je $result exporteren naar csv of via format table (ft) weergeven, je gebruikt nu een hashtable
Voor een goede beeld weergave zou ook een select kunnen gebruiken met een calculated property

[ Voor 96% gewijzigd door brid op 23-10-2015 21:27 . Reden: pc werkt lekkerder dan een mobiel :P ]

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


Acties:
  • 0 Henk 'm!

  • technoaddict
  • Registratie: Juni 2006
  • Laatst online: 11:32
PowerShell:
1
2
3
4
5
6
7
$Homefolders = Get-ChildItem -Path '\\examp-fs01\d$\home' –Directory | select -ExpandProperty name
$Result = foreach($homef in $Homefolders) {
$object = New-Object -TypeName PSObject
$object | Add-Member -MemberTypeNoteProperty -Name User -Value $homef
$object | Add-Member -MemberTypeNoteProperty -Name Size -Value ( (get-childitem "\\examp-fs01\d$\$homef\Documents\pwrmenu\UserPref" | Measure-Object -sum -property Length ).Sum / 1MB )
$Result += $object
} | Out-File C:\Beheer\Scripts\iets2.txt


EDIT: Ik krijg de output niet echt werkend met de User (homefolder naam) erbij.
Het lukt me wel om de Homefolder namen in $Result te krijgen. Daarna is het dus een kwestie van kenbaar maken dat er 2 'objecten' zijn, User en Size, en die te vullen.

Melding die ik het meest zie is
Add-Member : A parameter cannot be found that matches parameter name 'MemberTypeNoteProperty'

[ Voor 66% gewijzigd door technoaddict op 26-10-2015 14:37 ]


Acties:
  • +1 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 00:06
technoaddict schreef op maandag 26 oktober 2015 @ 13:51:
PowerShell:
1
2
3
4
5
6
7
$Homefolders = Get-ChildItem -Path '\\examp-fs01\d$\home' –Directory | select -ExpandProperty name
$Result = foreach($homef in $Homefolders) {
$object = New-Object -TypeName PSObject
$object | Add-Member -MemberTypeNoteProperty -Name User -Value $homef
$object | Add-Member -MemberTypeNoteProperty -Name Size -Value ( (get-childitem "\\examp-fs01\d$\$homef\Documents\pwrmenu\UserPref" | Measure-Object -sum -property Length ).Sum / 1MB )
$Result += $object
} | Out-File C:\Beheer\Scripts\iets2.txt


EDIT: Ik krijg de output niet echt werkend met de User (homefolder naam) erbij.
Het lukt me wel om de Homefolder namen in $Result te krijgen. Daarna is het dus een kwestie van kenbaar maken dat er 2 'objecten' zijn, User en Size, en die te vullen.

Melding die ik het meest zie is
Add-Member : A parameter cannot be found that matches parameter name 'MemberTypeNoteProperty'
Belangrijke vraag : welke versie van PS run je?
(dit kun je uitlezen dmv $PSVersionTable) : als je PS versie 3 of hoger gebruikt dan kun je [PSCustomObject] gebruiken ipv New-Object -Typename PSObject

Voorbeeld van het gebruik :
code:
1
2
3
4
[PSCustomObjecct] @{
Name = $bla.Name
Path = $bla.FullName
}


Hiermee is het een stuk makkelijker om custom objecten aan te maken (en het is een stuk overzichtelijker in je code).

Om nog even terug te komen op de reactie van brid : de property die je dient te gebruiken in scripts (tenzij je moeilijk wilt gaan doen uiteraard) is FullName : deze bevat het volledige bestandspad. De Name property bevat alleen het relatieve pad.

Acties:
  • 0 Henk 'm!

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

brid

Onze excuses voor het ongemak

Killah_Priest schreef op maandag 26 oktober 2015 @ 15:00:
[...]

PowerShell:
1
2
3
4
[PSCustomObjecct] @{
Name = $bla.Name
Path = $bla.FullName
}


Hiermee is het een stuk makkelijker om custom objecten aan te maken (en het is een stuk overzichtelijker in je code).

Om nog even terug te komen op de reactie van brid : de property die je dient te gebruiken in scripts (tenzij je moeilijk wilt gaan doen uiteraard) is FullName : deze bevat het volledige bestandspad. De Name property bevat alleen het relatieve pad.
Kijk toch weer wat geleerd vandaag
Moet helaas nog veel 2.0, heeft geen prio bij onze hosting party, maar ze gaan upgrade _/-\o_ _/-\o_
Helaas gebruiken veel samples op het internet nog de lastigere methode die ik voorstelde

Deze kende ik al wel
PowerShell:
1
2
3
4
5
6
$test = @{
path = "d:\temp"
Recurse = $true
}

Get-ChildItem @test


Voor al handige als wat je moet doen af hankelijk is van een switch of een variable
Je kan altijd met een add nog een extra parameter toevoegen.
Scheelt weer meerdere keren ongeveer dezelfde regel uit typen

[ Voor 28% gewijzigd door brid op 26-10-2015 15:21 ]

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


Acties:
  • 0 Henk 'm!

  • technoaddict
  • Registratie: Juni 2006
  • Laatst online: 11:32
Het wordt wel wat lastiger voor mij om de nieuwe code in het script te verwerken :)
Goed kunnen powershellen (of andere talen) lijkt me echt vet. Maar ik val helaas in de categorie mensen die scripting niet zo snel op weten te pakken.
Misschien moet ik meer doorzettingsvermogen tonen en is dit het moment om te blijven oefenen.
In ieder geval thanks voor de input!

Acties:
  • +1 Henk 'm!

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

brid

Onze excuses voor het ongemak

gewoon volhouden, veel pikken en proberen te snappen.
gewoon een beetje de basis leren , variabele(array,psobject), veel gebruikte loops(foreach,while , until), handige commands(WMI,AD,folders,get-content), presentatie(table,export xml/csv, mail, html-mail) en regex is ook wel handig als je log files door moet en als je eenmaal een beetje handig wordt input validatie en error handeling

In de basis ieder script ongeveer het zelfde: alles initiëren, ophalen, verwerken,presenteren

Je moet alleen bekend worden met de trucjes, al ontmoedigd :+

De meeste, ook ik, beginnen met dit soort scripts :+
PowerShell:
1
2
$server = Read-Host -Prompt "Server"
Get-WmiObject -ComputerName $server -Class win32_share| ft *


Oja en MS heeft wel een cursus powershell om wat feeling en zelf vertrouwen te krijgen.
Zodra als je ook maar iets Microsoft Based beheerd kun je het wel verkopen aan je manager

[ Voor 50% gewijzigd door brid op 26-10-2015 21:13 ]

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


Acties:
  • +1 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 00:06
technoaddict schreef op maandag 26 oktober 2015 @ 16:01:
Het wordt wel wat lastiger voor mij om de nieuwe code in het script te verwerken :)
Goed kunnen powershellen (of andere talen) lijkt me echt vet. Maar ik val helaas in de categorie mensen die scripting niet zo snel op weten te pakken.
Misschien moet ik meer doorzettingsvermogen tonen en is dit het moment om te blijven oefenen.
In ieder geval thanks voor de input!
Een enorme aanrader op het gebied van OS leren is het boek Learn PowerShell 3 in a Month of Lunches (2nd ed.)
http://morelunches.com/20...-month-of-lunches-2nd-ed/

Dit boek heeft mijn PS kennis destijds een enorme boost gegeven (omdat ik zelf een systeem beheerder ben was dat ook wel noodzakelijk om efficiënt te kunnen werken, ik automatiseer tegenwoordig erg veel taken welke voorheen met de hand gedaan werden).

Acties:
  • 0 Henk 'm!

  • technoaddict
  • Registratie: Juni 2006
  • Laatst online: 11:32
Leuk boek dat Lunches. Ben er zelfs in het weekend of in de avond uren mee bezig.
Het boek is prima te volgen, en ook al ben ik pas bij blz 100, Powershell is te volgen zolang er niet al te veel speciale tekens in een commando meegegeven hoeven te worden. Om een voorbeeld te geven

PS C:\>$a = get-content servers.txt
PS C:\>$a | foreach { if (!(get-hotfix -id KB957095 -computername $_)) { add-content $_ -path Missing-kb953631.txt
}}

Ik zit te kijken naar de -examples van Get-Hotfix. Als je dan een example als hier boven zie dan denk ik gelijk "Daar zit het lastige van elke scripting taal". Waarom zou je in dat commando een ! tussen (( moeten plaatsen? Of waar slaat die $_ op.
Tuurlijk is er een verklaring, maar je zou toch haast denken dat het makkelijker moet kunnen. Ik denk dat als je eenmaal snapt waar het voor dient, en je weet ook hoe je het moet toepassen, dat je dan ver bent. In ieder geval hoop ik na de volgende 100 bladzijdes weer een stuk verder te zijn. Maar tot nu toe heb ik er zeker wat van op gestoken.

Acties:
  • 0 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 00:06
technoaddict schreef op maandag 02 november 2015 @ 22:06:
Leuk boek dat Lunches. Ben er zelfs in het weekend of in de avond uren mee bezig.
Het boek is prima te volgen, en ook al ben ik pas bij blz 100, Powershell is te volgen zolang er niet al te veel speciale tekens in een commando meegegeven hoeven te worden. Om een voorbeeld te geven

PS C:\>$a = get-content servers.txt
PS C:\>$a | foreach { if (!(get-hotfix -id KB957095 -computername $_)) { add-content $_ -path Missing-kb953631.txt
}}

Ik zit te kijken naar de -examples van Get-Hotfix. Als je dan een example als hier boven zie dan denk ik gelijk "Daar zit het lastige van elke scripting taal". Waarom zou je in dat commando een ! tussen (( moeten plaatsen? Of waar slaat die $_ op.
Tuurlijk is er een verklaring, maar je zou toch haast denken dat het makkelijker moet kunnen. Ik denk dat als je eenmaal snapt waar het voor dient, en je weet ook hoe je het moet toepassen, dat je dan ver bent. In ieder geval hoop ik na de volgende 100 bladzijdes weer een stuk verder te zijn. Maar tot nu toe heb ik er zeker wat van op gestoken.
Even om het voor je te ontleden :
$a = get-content servers.txt gebruik je om de inhoud van Get-Content in een variable te stoppen
Vervolgens doe je $a | foreach : hiermee stuur je de output van $a naar de foreach loop : de output van $a zit nu in de "pipeline".
Volgende deel : if (!(get-hotfix -id KB957095 -computername $_)) Nu komt de IF statement (wat tussen haakjes staat is zeg maar de statement welke geevalueerd moet worden) : het uitroepteken betekent NOT in deze context : je zegt dus in feite IF NOT (get-hotfix).
De $_ is een automatische variable (er zijn er meerder in PS, bijvoorbeeld $true,$false,$error) : $_ betekent "the current pipeline" : wat momenteel in de pipeline zit wordt automatisch in de $_ variable opgeslagen.
De rest van het voorbeeld laat zichzelf wel raden neem ik aan.

Acties:
  • 0 Henk 'm!

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

brid

Onze excuses voor het ongemak

Ahh had een reminder gemaakt, maar zo te zien is Killah_Priest me voor :)

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


Acties:
  • 0 Henk 'm!

  • technoaddict
  • Registratie: Juni 2006
  • Laatst online: 11:32
Merci,
Het meeste begreep ik wel. Ging vooral om die ! en $_.
Duidelijke uitleg. Naast het snappen nu ook nog weten waar ik het moet plaatsen. En dat is een kwestie van blijven oefenen denk ik zo.
Ik denk het omslagpunt wel snel te kunnen maken. Omslagpunt van geen vertrouwen hebben in het kunnen powershellen naar het wel kunnen. Ga in ieder geval door.

Acties:
  • 0 Henk 'm!

  • horneddevil
  • Registratie: November 2010
  • Laatst online: 22-08 16:52
Killah_Priest schreef op dinsdag 27 oktober 2015 @ 18:14:
[...]


Een enorme aanrader op het gebied van OS leren is het boek Learn PowerShell 3 in a Month of Lunches (2nd ed.)
http://morelunches.com/20...-month-of-lunches-2nd-ed/

Dit boek heeft mijn PS kennis destijds een enorme boost gegeven (omdat ik zelf een systeem beheerder ben was dat ook wel noodzakelijk om efficiënt te kunnen werken, ik automatiseer tegenwoordig erg veel taken welke voorheen met de hand gedaan werden).
hij heeft ook alle inhoud van het boek verfilmd in een YoutubePlaylist : https://www.youtube.com/w...s&list=PL6D474E721138865A
Pagina: 1