[PowerShell] Screenoutput naar file

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • YellowOnline
  • Registratie: Januari 2005
  • Laatst online: 28-03-2023

YellowOnline

BEATI PAVPERES SPIRITV

Topicstarter
Ik heb een hoop verschillende functies zoals:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
FUNCTION GetInfo
    {
    Write-Host "        Fetching information from hosts..."
    Write-Host ""
    FOREACH ($strComputer in $arrComputers)
        {

        $colItems = Get-WmiObject -class "Win32_ComputerSystem" -namespace "root\CIMV2" -computername $strComputer -ErrorAction Stop
        FOREACH ($objItem in $colItems)
               {
            write-host 
            Write-host "        Computer Name: " $objItem.Name
            Write-host "        Domain       : " $objItem.Domain
            }
    
        $colItems = Get-WmiObject -class "Win32_NetworkAdapterConfiguration" -filter IPEnabled=TRUE -namespace "root\CIMV2" -computername $strComputer -EA Stop
        FOREACH ($objItem in $colItems)
              {
            Write-host "        IP address   : " $objItem.IPAddress 
            Write-host "        MAC address  : " $objItem.MACAddress 
               }
        }
    } 


(zwaar ingekorte versie)

De screenoutput is perfect, maar ik wil dit op dezelfde manier wegschrijven naar een txt of csv bestand. Geprobeerd:

1) Wrappen: "@(foreach{blablal})| export-csv export.csv" -> geeft leeg output bestand
2) Ter plekke pipen: "foreach ($bla in $blabla export-csv | export.csv)" -> geeft geen resultaten
3) Alles pipen: "write-host $blabla | export-csv export.csv" -> wordt genegeerd
Edit 4) Add-content per lijn gebruiken (wat per ongeluk nog in de code stond :X)

Nog suggesties? Alvast mijn dank. Om het in een groter geheel te zien, spiek toch eens naar mij gesloten-wegens-veel-te-veel-code thread [PowerShell] Screenoutput naar file.

Edit: voor wie nog met Batch werkt, het is eigenlijk een equivalent van ">blabla.txt" dat ik zoek, maar om een of andere reden is dat niet even eenvoudig geimplementeerd in PS |:(

[ Voor 11% gewijzigd door YellowOnline op 10-03-2009 09:15 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Dit lijkt mij een zinvolle oplossing? En die had ik toch echt in no time gevonden.

[ Voor 3% gewijzigd door RobIII op 09-03-2009 23:12 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • YellowOnline
  • Registratie: Januari 2005
  • Laatst online: 28-03-2023

YellowOnline

BEATI PAVPERES SPIRITV

Topicstarter
RobIII schreef op maandag 09 maart 2009 @ 23:12:
Dit lijkt mij een zinvolle oplossing? En die had ik toch echt in no time gevonden.
Dat doet niet meer dan een variabele wegschrijven naar een bestand. Dat is hier niet de bedoeling: ik wil de write-host mee in dat bestand zien + de output per variabele per computer in de array. En niet onbelangrijk: overwrite in plaats van append elke keer de hele functie uitgevoerd wordt. De bedoeling is uiteindelijk een bestand te krijgen dat er ongeveer zo uitziet:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
TWEAK001: Microsoft Office Professional 2007
TWEAK001: Microsoft Windows Service Pack 2 
TWEAK001: Symantec Antivirus 7.5
TWEAK001: Avaya IP Agent 8.2
TWEAK001: SCCM 1.1
TWEAK001: Compatibility Pack for Office 2007
etc
TWEAK002: Microsoft Windows Service Pack 2
TWEAK002: Symantec Antivirus 7.5
TWEAK002: Avaya IP Agent 8.2
TWEAK002: SCCM 1.5
etc
TWEAK003: Microsoft Windows Service Pack 2
TWEAK003: Symantec Antivirus 7.4
TWEAK003: Avaya IP Agent 8.2
TWEAK003: SCCM 1.5
etc


Op dat bestand kunnen dan gemakkelijk bewerkingen uitgevoerd worden. Lukt perfect met een eerder gemaakt batchbestand (cf. gesloten thread), maar niet met PS :/

[ Voor 43% gewijzigd door YellowOnline op 09-03-2009 23:31 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Dat komt dan door mijn gebrek aan kennis van PowerShell :P

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • YellowOnline
  • Registratie: Januari 2005
  • Laatst online: 28-03-2023

YellowOnline

BEATI PAVPERES SPIRITV

Topicstarter
RobIII schreef op maandag 09 maart 2009 @ 23:16:
Dat komt dan door mijn gebrek aan kennis van PowerShell :P
Mja, behalve elevator ben ik nog niemand tegengekomen die PS gebruikt. Nochtans een geweldig ding, echt waar.

@RobIII
Elevator staat in bold omdat ik altijd namen in mijn posts in bold zet. Tekstopmaak heet dat ;) De echte reden is dat in lange threads mensen er zo opmerkingen gemakkelijk uit kunnen vissen die aan hen gericht zijn op op hen van toepassing zijn.

[ Voor 30% gewijzigd door YellowOnline op 09-03-2009 23:24 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
YellowOnline schreef op maandag 09 maart 2009 @ 23:18:
[...]


Mja, behalve elevator ben ik nog niemand tegengekomen die PS gebruikt. Nochtans een geweldig ding, echt waar.
Waarom moet elevator's naam steeds in Bold? Denk je dat 'ie je dan beter hoort? :+
Ik geloof nooit dat hij de enige is die PowerShell gebruikt hier op GoT. No way. Maar je moet wél even geduld hebben mocht er niemand reageren in afzienbare tijd ;) Ik heb er overigens wel ooit mee gestoeid maar was daar na 10 minuten mee klaar omdat ik andere zaken te doen had :)
YellowOnline schreef op maandag 09 maart 2009 @ 23:18:
Elevator staat in bold omdat ik altijd namen in mijn posts in bold zet. Tekstopmaak heet dat ;)
Nergens voor nodig (en persoonlijk, maar trek je daar niet te veel van aan, vind ik het storend). Doe dan een linkje ;)
Genoeg offtopic geneuzeld. Als ik later vanavond even tijd heb zal ik 't eens installeren en kijken wat ik voor je kan doen ;)

[edit]
Nog even een domme vraag dan:
The Write-Host cmdlet customizes output. You can specify the color of text by using the ForegroundColor parameter and you can specify the background color by using the BackgroundColor parameter. The Separator parameter lets you specify a string to use to separate displayed objects. The particular result depends on the program that is hosting Windows PowerShell.
The Write-Output cmdlet sends the specified object down the pipeline to the next command. If the command is the last in the pipeline, the object is displayed in the console.
Moet je uberhaupt wel Write-Host hebben :?

[ Voor 78% gewijzigd door RobIII op 09-03-2009 23:34 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • YellowOnline
  • Registratie: Januari 2005
  • Laatst online: 28-03-2023

YellowOnline

BEATI PAVPERES SPIRITV

Topicstarter
RobIII schreef op maandag 09 maart 2009 @ 23:19:
Moet je uberhaupt wel Write-Host hebben :?
Ik zal er morgen eens over nadenken, nu wat laat. Ik ben zelf geen PS expert zoals je kan raden. Ik ben met een piepkleine codesnippet begonnen en alles is daarrond gegroeid. Die write-host sleur ik al de hele tijd mee en was perfect zolang ik tevreden was met screenoutput. Tja, on-the-fly programmeren, op school hadden ze me nochtans PST-diagrammen geleerd :+ Maar goed, dat was in de tijd van Pascal, dat ook al 15 jaar uitgestorven is denk ik.

Acties:
  • 0 Henk 'm!

  • Coromoto
  • Registratie: April 2006
  • Laatst online: 05-09 11:59
Wat wil je uiteindelijk bereiken?
1. Een bestand met precies dezelfde output als op scherm getoond middels dat eerste scriptje;
2. Een bestand volgens het tweede voorbeeld (tweak001:MS Office 10)
3. Een CSV bestand (tweak001,"MS Office 10")

Het eerste kan je volgens mij het beste doen door een variabele te gerbuiken voor elke regel, en die zowel met write-host naar het scherm te sturen als toevoegen aan een andere variabele die je uiteindelijk naar file redirect / stuurt.

$curline = " dit is regel 1"
write-host $curline
$logfile = $logfile + $curline
$curline = " dit is regel 2"
write-host $curline
$logfile = $logfile + $curline

Hier moet je natuurlijk een functie van maken ;)

Voor 2 geldt eigenlijk hetzelfde.

Export-csv werkt alleen goed met variabelen die objecten zijn, oftewel meerdere elementen hebben (multidemnsionaal) IIRC.

Hope this helps, ik kijk morgenochtend voor je verder als ik weer achter de Powershell zit.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik heb niet zo'n verstand van PowerShell, maar hier hebben ze het over hetzelfde probleem http://www.vistax64.com/p...ng-output-powershell.html

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • YellowOnline
  • Registratie: Januari 2005
  • Laatst online: 28-03-2023

YellowOnline

BEATI PAVPERES SPIRITV

Topicstarter
Coromoto schreef op dinsdag 10 maart 2009 @ 01:35:
Wat wil je uiteindelijk bereiken?
1. Een bestand met precies dezelfde output als op scherm getoond middels dat eerste scriptje;
2. Een bestand volgens het tweede voorbeeld (tweak001:MS Office 10)
3. Een CSV bestand (tweak001,"MS Office 10")

Het eerste kan je volgens mij het beste doen door een variabele te gerbuiken voor elke regel, en die zowel met write-host naar het scherm te sturen als toevoegen aan een andere variabele die je uiteindelijk naar file redirect / stuurt.

$curline = " dit is regel 1"
write-host $curline
$logfile = $logfile + $curline
$curline = " dit is regel 2"
write-host $curline
$logfile = $logfile + $curline

Hier moet je natuurlijk een functie van maken ;)

Voor 2 geldt eigenlijk hetzelfde.

Export-csv werkt alleen goed met variabelen die objecten zijn, oftewel meerdere elementen hebben (multidemnsionaal) IIRC.

Hope this helps, ik kijk morgenochtend voor je verder als ik weer achter de Powershell zit.
Oops, ik heb wat voor verwarring gezorgd door twee verschillende functies als voorbeeld te nemen. Ik heb zowel een functie die hardware info toont (het eerste voorbeeld in PS) als een functie die software opsomt (waarvan het tweede voorbeeld een fictieve output is). Maar het idee is in beide gevallen wel hetzelfde: de letterlijke screenoutput van de FOREACH naar een bestand wegschrijven.

Maar jou idee lijkt mij wel een oplossing te bieden. Het lijkt me alleen gek dat er geen minder omslachtige methode in PS voorzien is. Enfin, ik ga er mee aan de slag.

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Ik weet niet in hoeverre PS lijkt op een gewone shell zoals sh of bash, maar misschien heb je toch wat hieraan. Pipen naar een bestand werkt natuurlijk niet, met pipes neem je de uitvoer van je eerste programma en gebruik je die als invoer voor de tweede. Bijvoorbeeld om te greppen op data uit je script ofzo.

De operator die normaal onder linux/bsd gebruikt wordt in shells voor hetgeen jij wil is > of >>, misschien is deze ook beschikbaar onder PS. (Deze operator betekent letterlijk "zet het daar maar in, al dan niet door te appenden afhankelijk welke van de twee je gebruikt).

[ Voor 3% gewijzigd door Grijze Vos op 10-03-2009 09:17 ]

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Grijze Vos schreef op dinsdag 10 maart 2009 @ 09:17:
Ik weet niet in hoeverre PS lijkt op een gewone shell zoals sh of bash, maar misschien heb je toch wat hieraan. Pipen naar een bestand werkt natuurlijk niet, met pipes neem je de uitvoer van je eerste programma en gebruik je die als invoer voor de tweede. Bijvoorbeeld om te greppen op data uit je script ofzo.

De operator die normaal onder linux/bsd gebruikt wordt in shells voor hetgeen jij wil is > of >>, misschien is deze ook beschikbaar onder PS. (Deze operator betekent letterlijk "zet het daar maar in, al dan niet door te appenden afhankelijk welke van de twee je gebruikt).
In de link die ik hierboven poste staat idd het volgende
You can continue to use > and >> to redirect console output. But using a
cmdlet like Out-File is preferred. There is also the Tee-Object cmdlet
which will let you send output to a file and the console.
Dus het lijkt me dat je idd > en >> kunt gebruiken, of een cmdlet "Out-File"

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)

Ik zou gewoon "echo" (of zelfs gewoon $var) gebruiken, dan kan je perfect redirecten:

C#:
1
2
3
4
5
6
7
8
9
PS U:\> type test2.ps1
echo "whee"
$a = "whee2"
$a

PS U:\> ./test2.ps1 >a.csv
PS U:\> gc a.csv
whee
whee2


Het zou echter mooier zijn als je gewoon de output pipeline gebruikt door zelf objectjes te maken zodat je vervolgens met de standard Export-Csv en Convert-ToHTml kan gebruiken. Je krijgt dan zoiets:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function MakeObj($hm) {
    # Create our own version of the user object
    $TmpObj = New-Object PSObject

    foreach($key in $hm.keys) {
        $TmpObj | Add-Member -MemberType NoteProperty -Name $key -value $hm.$key
    } # foreach

    return $tmpObj
} # func. MakeObj

$a = @()
$a += (MakeObj @{"Adres" = "Straat 12a"; "Naam" = "ohnee"})
$a += (MakeObj @{"Adres" = "Straat 13a"; "Naam" = "wat"})

$a


En die kan je dan vervolgens door een van eerder genoemde functies gooien - dat is een stuk flexibeler omdat je nu de andere set ook kan gebruiken, zo kan je bv. weer gaan filteren.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
PS U:\> $list = ./test3.ps1
PS U:\> $list

Adres                                   Naam
-----                                   ----
Straat 12a                              ohnee
Straat 13a                              wat


PS U:\> $list | where-object { $_.Naam -eq "wat" }

Adres                                   Naam
-----                                   ----
Straat 13a                              wat

Acties:
  • 0 Henk 'm!

  • Coromoto
  • Registratie: April 2006
  • Laatst online: 05-09 11:59
YellowOnline schreef op dinsdag 10 maart 2009 @ 09:07:
[...]


Oops, ik heb wat voor verwarring gezorgd door twee verschillende functies als voorbeeld te nemen. Ik heb zowel een functie die hardware info toont (het eerste voorbeeld in PS) als een functie die software opsomt (waarvan het tweede voorbeeld een fictieve output is). Maar het idee is in beide gevallen wel hetzelfde: de letterlijke screenoutput van de FOREACH naar een bestand wegschrijven.

Maar jou idee lijkt mij wel een oplossing te bieden. Het lijkt me alleen gek dat er geen minder omslachtige methode in PS voorzien is. Enfin, ik ga er mee aan de slag.
Indien je geen scherm output nodig hebt kan je volstaan met de $curline telkens te dumpen naar file met Out-File -append, of de $logfile aan het eind pas met Out-File (ben je wel je logging kwijt als het script ergens onderweg stopt voordat je $logfile wegschrijft).
Heb je wel scherm output nodig dan kan je Tee-Object gebruiken (moet je wel even checken of die ook kan appenden), of gewoon $curline eerst tonen en dan met Out-File wegschrijven.
Grijze Vos schreef op dinsdag 10 maart 2009 @ 09:17:
Ik weet niet in hoeverre PS lijkt op een gewone shell zoals sh of bash, maar misschien heb je toch wat hieraan. Pipen naar een bestand werkt natuurlijk niet, met pipes neem je de uitvoer van je eerste programma en gebruik je die als invoer voor de tweede. Bijvoorbeeld om te greppen op data uit je script ofzo.

De operator die normaal onder linux/bsd gebruikt wordt in shells voor hetgeen jij wil is > of >>, misschien is deze ook beschikbaar onder PS. (Deze operator betekent letterlijk "zet het daar maar in, al dan niet door te appenden afhankelijk welke van de twee je gebruikt).
Hij probeerde niet te pipen naar een bestand, maar naar een cmd-let (lees: functie of commando): Export-CSV. Dit is natuurlijk toegestaan en werkt prima, mits je een object aanbiedt. Dit deed hij niet: hij schreef de $bla naar de console, en dan is er niets meer om aan Export-CSV te bieden.

Edit: bovenstaande tip van elevator is natuurlijk de perfecte manier om het te doen.

[ Voor 2% gewijzigd door Coromoto op 10-03-2009 09:46 . Reden: Ik ben even afgeleid door mijn werk, en ondertussen zijn er veel betere posts bijgekomen. ]


Acties:
  • 0 Henk 'm!

  • ITMON
  • Registratie: November 2004
  • Laatst online: 20-10-2024
Aan het begin van je script plaats je dit lijntje..

start-transcript -path .\log.txt

--> dit plaatst zowat alles wat op het scherm komt naar log.txt in de map waarin je het script uitvoert..
Er zal wat overhead in zitten, maar je hebt alleszins een makkelijke oplossing.


Op het einde van je script ..

stop-transcript


get-help start-transcript

[ Voor 18% gewijzigd door ITMON op 10-03-2009 12:28 ]


Acties:
  • 0 Henk 'm!

  • Coromoto
  • Registratie: April 2006
  • Laatst online: 05-09 11:59
ITMON schreef op dinsdag 10 maart 2009 @ 12:26:
Aan het begin van je script plaats je dit lijntje..

start-transcript -path .\log.txt

--> dit plaatst zowat alles wat op het scherm komt naar log.txt in de map waarin je het script uitvoert..
Er zal wat overhead in zitten, maar je hebt alleszins een makkelijke oplossing.


Op het einde van je script ..

stop-transcript


get-help start-transcript
8)
Eigenlijk zou dit niet in je toolkit mogen ontbreken:
Windows PowerShell Graphical Help File
Of dit:
PowerGUI
Pagina: 1