Kwam net achter iets sufs, als je powershell output in Azure Devops, en de tekst word afgekapt in de output, dan staat het ook afgekapt in de raw logfiles....
IF en functies of toch variablen?
Vraagje, ik ben een script aan het maken waar ik best wat IF'jes in elkaar bundel. Als dit dan check dit of dat en daarvan de output weer IF'en en dan pas een actie uitvoeren.
Als ik in elke IF het commando zelf zet wordt het best wel een onoverzichtelijk script. Zou het een idee zijn om allemaal functies aan te maken en dan in de IF'jes te verwijzen naar de functies? Of is dat niet handig en veroorzaakt dat veel meer load? Alle functies moeten natuurlijk van te voren aangemaakt worden terwijl hij misschien niet eens gebruikt wordt. Ik kan natuurlijk ook verwijzen naar variablen waar het "commando" in staat maar gaat hij alle variablen aanmaken zonder dat ze misschien gebruikt worden.
Vraagje, ik ben een script aan het maken waar ik best wat IF'jes in elkaar bundel. Als dit dan check dit of dat en daarvan de output weer IF'en en dan pas een actie uitvoeren.
Als ik in elke IF het commando zelf zet wordt het best wel een onoverzichtelijk script. Zou het een idee zijn om allemaal functies aan te maken en dan in de IF'jes te verwijzen naar de functies? Of is dat niet handig en veroorzaakt dat veel meer load? Alle functies moeten natuurlijk van te voren aangemaakt worden terwijl hij misschien niet eens gebruikt wordt. Ik kan natuurlijk ook verwijzen naar variablen waar het "commando" in staat maar gaat hij alle variablen aanmaken zonder dat ze misschien gebruikt worden.
😲
zijn de IF's genest (een if binnen een if) of zijn deze 'niet genest' (na elkaar telkens een if) of een combinatie van de 2? kun je misschien een snippet geven van een voorbeeld?mswp schreef op dinsdag 10 december 2019 @ 09:40:
IF en functies of toch variablen?
Vraagje, ik ben een script aan het maken waar ik best wat IF'jes in elkaar bundel. Als dit dan check dit of dat en daarvan de output weer IF'en en dan pas een actie uitvoeren.
Als ik in elke IF het commando zelf zet wordt het best wel een onoverzichtelijk script. Zou het een idee zijn om allemaal functies aan te maken en dan in de IF'jes te verwijzen naar de functies? Of is dat niet handig en veroorzaakt dat veel meer load? Alle functies moeten natuurlijk van te voren aangemaakt worden terwijl hij misschien niet eens gebruikt wordt. Ik kan natuurlijk ook verwijzen naar variablen waar het "commando" in staat maar gaat hij alle variablen aanmaken zonder dat ze misschien gebruikt worden.
- BSc TI + CCNA R&S (Expired ofcourse) + CCNA SEC (Also expired ofc)-
Ja het zijn geneste IF's.Xelefim schreef op dinsdag 10 december 2019 @ 11:21:
[...]
zijn de IF's genest (een if binnen een if) of zijn deze 'niet genest' (na elkaar telkens een if) of een combinatie van de 2? kun je misschien een snippet geven van een voorbeeld?
Dit een beetje, misschien nog een nesting erbij maar dat weet ik nog niet zeker. Uiteindelijk komt er bij 2 van de 4 IF's een copy die het zelfde is.
code:
1
2
3
4
5
6
7
8
9
10
11
| IF { IF {} Else { } } Else { IF{ } ELSE { IF { } } } |
😲
Persoonlijk zou ik geen nested If/Elsjes doen. Maakt code altijd lastig leesbaar en je weet op een gegeven moment niet meer wat de voorwaarden zijn waardoor je in een bepaalde conditie terecht komt. (Op het moment van schrijven wel, maar als je er over 4 maanden weer naar kijkt heb je geen idee meer).mswp schreef op dinsdag 10 december 2019 @ 11:57:
[...]
Ja het zijn geneste IF's.
Dit een beetje, misschien nog een nesting erbij maar dat weet ik nog niet zeker. Uiteindelijk komt er bij 2 van de 4 IF's een copy die het zelfde is.
code:
1 2 3 4 5 6 7 8 9 10 11 IF { IF {} Else { } } Else { IF{ } ELSE { IF { } } }
Als twee van vier statements een exacte kopie zijn dan zou je daar in elk geval al een functie voor kunnen maken.
Maar zonder 'echte' code is het altijd een beetje lastig zeggen waar je mogelijk e.e.a. kan verbeteren.
Wat zou kunnen helpen is:
- Negatieve check converteren naar positieve checks. Negatieve checks kun je laten doorlopen in een else.
- Zo snel mogelijk weer uit de if/else terugkeren naar de functie. (en niet eindeloos laten doorlopen).
- Proberen zoveel mogelijk condities om te bouwen naar functies.
Ik maak zelf zeer veel gebruik van 'switch' om de code goed leesbaar te houden.mswp schreef op dinsdag 10 december 2019 @ 11:57:
[...]
Ja het zijn geneste IF's.
Dit een beetje, misschien nog een nesting erbij maar dat weet ik nog niet zeker. Uiteindelijk komt er bij 2 van de 4 IF's een copy die het zelfde is.
[/code]
Denk dat 99% van code die ik maak in switch blokjes staat.
Zo iets
$ContinueDeploy = $True
Switch($True){
$ContinueDeploy{
#do stuff
if($iets -eq 'dat'){$ContinueDeploy = $False}
}#s
$ContinueDeploy{
#do stuff
}#switch
#enz enz
}#switch
Je maakt je echt druk om de verkeerde zaken. Dit soort zaken hebben geen noemenswaardige invloed. Als jij je hier druk over maakt dan kun je beter geen scripttaal gebruiken.mswp schreef op dinsdag 10 december 2019 @ 09:40:
Of is dat niet handig en veroorzaakt dat veel meer load? Alle functies moeten natuurlijk van te voren aangemaakt worden terwijl hij misschien niet eens gebruikt wordt.
@mufana
3x van 4 is het zelfde geworden, deze heb ik in een function gezet. Ik heb een andere IF inderdaad ook 1 keer omgedraaid van negatief naar positief wat weer een Else scheelde.
Wat bedoel je precies met condities opbouwen naar functies?
@Thijs B
Dit heb ik nu ook gebruikt alleen gecombineerd, eerst ging hij 5x checken of je in een afdeling zat maar nu pakt hij alleen de juiste afdeling als je lid ben van die afdeling en de rest slaat hij over.
@downtime
Uhm, niet mee eens. Als een script moet runnen voordat een applicatie start en dat duurt of 1 seconde of 5 of meer seconde + de opstart tijd van de applicatie kan ott veel ergernis zorgen. Ik doe maak me er liever 1 keer druk over dan dat ik 10x moet zoeken naar "snellere" manier.
3x van 4 is het zelfde geworden, deze heb ik in een function gezet. Ik heb een andere IF inderdaad ook 1 keer omgedraaid van negatief naar positief wat weer een Else scheelde.
Wat bedoel je precies met condities opbouwen naar functies?
@Thijs B
Dit heb ik nu ook gebruikt alleen gecombineerd, eerst ging hij 5x checken of je in een afdeling zat maar nu pakt hij alleen de juiste afdeling als je lid ben van die afdeling en de rest slaat hij over.
@downtime
Uhm, niet mee eens. Als een script moet runnen voordat een applicatie start en dat duurt of 1 seconde of 5 of meer seconde + de opstart tijd van de applicatie kan ott veel ergernis zorgen. Ik doe maak me er liever 1 keer druk over dan dat ik 10x moet zoeken naar "snellere" manier.
😲
Je spreekt hier over een niet noemenswaardige vertraging. Overigens kun je dit soort zaken prima meten dmv Measure-Command (en dan zul je zien dat het verschil hooguit enkele milliseconden zijn, tenzij je bv tig iteraties doet in een loop, maar dan kun je vaak weer beter gaan multi-threaden)mswp schreef op dinsdag 10 december 2019 @ 21:37:
@downtime
Uhm, niet mee eens. Als een script moet runnen voordat een applicatie start en dat duurt of 1 seconde of 5 of meer seconde + de opstart tijd van de applicatie kan ott veel ergernis zorgen. Ik doe maak me er liever 1 keer druk over dan dat ik 10x moet zoeken naar "snellere" manier.
Maar over dat soort verschillen gaat het niet. Denk eerder aan milliseconden. Dit soort zaken optimaliseren kost je tijd die je nooit terug wint. Het starten van powershell.exe zelf kost je honderden malen meer.mswp schreef op dinsdag 10 december 2019 @ 21:37:
@downtime
Uhm, niet mee eens. Als een script moet runnen voordat een applicatie start en dat duurt of 1 seconde of 5 of meer seconde + de opstart tijd van de applicatie kan ott veel ergernis zorgen. Ik doe maak me er liever 1 keer druk over dan dat ik 10x moet zoeken naar "snellere" manier.
Tijdverschillen zie je pas als je in- en output gaat doen. Inlezen van disk is relatief traag, data versturen over het netwerk is traag, output naar het scherm is traag. Maar het parsen van het script zal nooit een bottleneck zijn.
Als je binnen je if/elsjes nog een heleboel logica hebt staan. (Do/while loopjes, foreach zaken). Dat kun je beter naar functies verplaatsen. Hierdoor verbeter je de leesbaarheid. Zeker als je de functies duidelijke namen geeft. (Ook al is naamgeving één van de moeilijkste dingen in programmeren).mswp schreef op dinsdag 10 december 2019 @ 21:37:
@mufana
3x van 4 is het zelfde geworden, deze heb ik in een function gezet. Ik heb een andere IF inderdaad ook 1 keer omgedraaid van negatief naar positief wat weer een Else scheelde.
Wat bedoel je precies met condities opbouwen naar functies?
Functies aanmaken in je script zorgt ook niet voor een vertraging. Dat is alleen maar een good practice.
Maar begrijp ik goed dat je dit script laat draaien voordat een applicatie start? Kan dat niet beter tijdens het inloggen? Scripts die moeten draaien voordat een app start zijn altijd problematisch omdat je nooit weet hoelang een script bezig is. Op een ontwikkelmachine is het misschien snel, op een paar test machines mogelijk ook. Op pc's waar endusers werken is het vaak weer een heel anders. En dan hebben we het nog niet eens gehad over de rechten waaronder een script moet draaien.
Je kunt dan beter gebruik maken van functies. Zorgen maken over optimalisatie (winnen van tijd) hoef je naar mijn weten niet te doen tenzij hetgeen dat je doet echt geen miliseconden aan verlies mag hebben.mswp schreef op dinsdag 10 december 2019 @ 11:57:
[...]
Ja het zijn geneste IF's.
Dit een beetje, misschien nog een nesting erbij maar dat weet ik nog niet zeker. Uiteindelijk komt er bij 2 van de 4 IF's een copy die het zelfde is.
- BSc TI + CCNA R&S (Expired ofcourse) + CCNA SEC (Also expired ofc)-
Als milliseconden ertoe doen dan wil je uberhaupt geen scripttaal meer gebruiken. C ligt dan meer voor de hand. Zelfs C# of Java voldoet dan niet meer.Xelefim schreef op donderdag 12 december 2019 @ 13:24:
[...]
Zorgen maken over optimalisatie (winnen van tijd) hoef je naar mijn weten niet te doen tenzij hetgeen dat je doet echt geen miliseconden aan verlies mag hebben.
Het gaat mij met dit script ook niet zozeer over de vertraging maar meer in het algemeen, ik ben van mening dat als je run time kan verminderen je dit zeker moet doen. Het kost mij nu misschien meer om uit te zoeken maar eenmaal wetende wat de best practice is levert in de toekomst meer op.
@mufana Nee, was ook meer als voorbeeld. Dit script runt bij log-in. Het script zal al klaar zijn voordat de gebruiker doorheeft dat een applicatie gestart moet worden.
Ik zal nog eens gaan kijken naar measure, tot nu toe nog niet vaak gebruikt. Ik heb wel m'n opbouw van het script nog eens goed bekeken en wat if'jes kunnen weghalen/opvolgen wat het allemaal wat logischer maakt en waardoor ik nog maar 1 functie over hou.
@Xelefim Is er een proces wat een script zo vaak/snel kan runnen dat het om milliseconden gaat? Ik ben nu eigenlijk wel nieuwsgierig hoe je zoiets draaiend krijg.
@mufana Nee, was ook meer als voorbeeld. Dit script runt bij log-in. Het script zal al klaar zijn voordat de gebruiker doorheeft dat een applicatie gestart moet worden.
Ik zal nog eens gaan kijken naar measure, tot nu toe nog niet vaak gebruikt. Ik heb wel m'n opbouw van het script nog eens goed bekeken en wat if'jes kunnen weghalen/opvolgen wat het allemaal wat logischer maakt en waardoor ik nog maar 1 functie over hou.
@Xelefim Is er een proces wat een script zo vaak/snel kan runnen dat het om milliseconden gaat? Ik ben nu eigenlijk wel nieuwsgierig hoe je zoiets draaiend krijg.
😲
Zou niet teveel tijd besteden aan runtimes van een script als het niet echt belangrijk is. Er zijn zoveel factoren die runtime kunnen beïnvloeden. Die kun je nooit allemaal afdichten. Daarnaast is het ook altijd discussie wat acceptabel is qua runtimes. Is dat 1 seconden, 10? 20? een minuut?mswp schreef op donderdag 12 december 2019 @ 19:11:
Het gaat mij met dit script ook niet zozeer over de vertraging maar meer in het algemeen, ik ben van mening dat als je run time kan verminderen je dit zeker moet doen. Het kost mij nu misschien meer om uit te zoeken maar eenmaal wetende wat de best practice is levert in de toekomst meer op.
@mufana Nee, was ook meer als voorbeeld. Dit script runt bij log-in. Het script zal al klaar zijn voordat de gebruiker doorheeft dat een applicatie gestart moet worden.
Ik zal nog eens gaan kijken naar measure, tot nu toe nog niet vaak gebruikt. Ik heb wel m'n opbouw van het script nog eens goed bekeken en wat if'jes kunnen weghalen/opvolgen wat het allemaal wat logischer maakt en waardoor ik nog maar 1 functie over hou.
@Xelefim Is er een proces wat een script zo vaak/snel kan runnen dat het om milliseconden gaat? Ik ben nu eigenlijk wel nieuwsgierig hoe je zoiets draaiend krijg.
Als je gaat programmeren dan kun je soms uren/dagen of weken besteden aan het verbeteren / optimaliseren van je code. Maar dan lever je niets op. Dus als je een best practice zoekt zou mijn advies zijn: Ben pragmatisch. Lever een 1.0 versie op die gewoon doet wat het moet doen. Zorg dat deze draait in productie. En ga vandaaruit -alleen bij problemen- optimalisaties doorvoeren.
Ik had het ook over optimalisatie door je code te verbeteren om scripts sneller te laten runnen, maar wou expliciet zeggen dat je hier niet aan moet beginnen om paar 'miliseconden' te winnen. Anders moet je downtime zijn reactie hierboven zien.mswp schreef op donderdag 12 december 2019 @ 19:11:
Het gaat mij met dit script ook niet zozeer over de vertraging maar meer in het algemeen, ik ben van mening dat als je run time kan verminderen je dit zeker moet doen. Het kost mij nu misschien meer om uit te zoeken maar eenmaal wetende wat de best practice is levert in de toekomst meer op.
@mufana Nee, was ook meer als voorbeeld. Dit script runt bij log-in. Het script zal al klaar zijn voordat de gebruiker doorheeft dat een applicatie gestart moet worden.
Ik zal nog eens gaan kijken naar measure, tot nu toe nog niet vaak gebruikt. Ik heb wel m'n opbouw van het script nog eens goed bekeken en wat if'jes kunnen weghalen/opvolgen wat het allemaal wat logischer maakt en waardoor ik nog maar 1 functie over hou.
@Xelefim Is er een proces wat een script zo vaak/snel kan runnen dat het om milliseconden gaat? Ik ben nu eigenlijk wel nieuwsgierig hoe je zoiets draaiend krijg.
Klein voorbeeld als je toch geïnteresseerd bent:
Als je een string gedeeltelijk wilt zoeken zijn er sowieso talloze manieren om het te doen, maar welke is de snelste?
code:
1
| -like |
code:
1
| -match |
code:
1
| -contains #NIET TE GEBRUIKEN OM STRINGS PARTIALLY TE ZOEKEN |
Elk van de 3 voorgaande gebruikt 'zijn' eigen manier en afhankelijk van verschillende zaken zal de één sneller werken dan de ander. Hierbij praat ik dus over optimalisatie. Maar ik had uitdrukkelijk tevens gezegd dat het vaak gaat over miliseconden (indien het over een normale string gaat natuurlijk). Indien miliseconden winnen dus verwaarloosbaar is in jouw geval, vergeet dan alles wat je zonet gelezen hebt
- BSc TI + CCNA R&S (Expired ofcourse) + CCNA SEC (Also expired ofc)-
Contains is toch alleen voor collections?
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
En Match is voor Regex. Die drie zijn dus niet uitwisselbaar.Sebazzz schreef op vrijdag 13 december 2019 @ 12:09:
Contains is toch alleen voor collections?
@Sebazzzdowntime schreef op vrijdag 13 december 2019 @ 12:51:
[...]
En Match is voor Regex. Die drie zijn dus niet uitwisselbaar.
Dat is waar! slecht voorbeeld om strings op te halen
@downtime
tenzij je regex expressies gebruikt in je conditie. het was maar om te duidelijk te maken dat je op 2 manieren hetzelfde resultaat kunt bekomen in powershell maar de 1 sneller is dan de andere.
Wat lijkt jou sneller?
https://www.computerperfo..._Between_-Like_and_-Match
Ik begin er meestal niet aan aangezien in mijn gevallen verwaarloosbaar is.
- BSc TI + CCNA R&S (Expired ofcourse) + CCNA SEC (Also expired ofc)-
Ik denk dat op het moment dat het uitmaakt hoe snel een regex vs een like is dat je zoveel data verwerkt dat je het misschien niet meer met Powershell moet doen maar een gecompileerde applicatie moet doen
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
Ik mijd regexen maar niet vanwege performance maar vanwege de complexiteit en foutgevoeligheid ervan. Ik schrijf liever begrijpelijke en foutvrije scripts dan supersnelle scripts. Ik heb jouw link niet gelezen maar ik verwacht dat regexen vanwege die complexiteit ook trager zijn.Xelefim schreef op vrijdag 13 december 2019 @ 13:02:
[...]
@Sebazzz
Dat is waar! slecht voorbeeld om strings op te halen
@downtime
tenzij je regex expressies gebruikt in je conditie. het was maar om te duidelijk te maken dat je op 2 manieren hetzelfde resultaat kunt bekomen in powershell maar de 1 sneller is dan de andere.
Wat lijkt jou sneller?
https://www.computerperfo..._Between_-Like_and_-Match
Ik begin er meestal niet aan aangezien in mijn gevallen verwaarloosbaar is.
Ik heb een kanaal (#dutch) onder de usergroups aangevraagd in de PowerShell discord, deze is gekoppeld in Slack.
Pick your poison:
http://poshcode.org/slack
http://poshcode.org/discord
Pick your poison:
http://poshcode.org/slack
http://poshcode.org/discord
[ Voor 5% gewijzigd door Lampiz op 16-12-2019 20:33 ]
Haha ik zie de Dutch meer als slowchat, als je echt hulp nodig hebt heb je bovenaan #powershell-help
Ik probeer niks te kapen, laat dat duidelijk zijn. Alleen wilde ik mensen tippen over de discord/slack.
Ik heb het #dutch kanaal aangevraagd, het is alleen een notie dat dat kanaal ook bestaat
. Bovendien antwoord ik op Slack/Discord eerder dan op dit topic denk ik.
Ik heb het #dutch kanaal aangevraagd, het is alleen een notie dat dat kanaal ook bestaat
[ Voor 18% gewijzigd door Lampiz op 16-12-2019 21:28 ]
hmm, ik kom er even niet op. Mag ik jullie vragen om mee te denken?
Ik heb een foreach loopje die van alle bestanden in een map bepaalde strings ophaalt, alle bestanden zijn het zelfde. Ik zet de strings in een variable zodat ik er later iets mee kan.
Nu wil ik van al deze bestanden en variable 1 tabel maken en dit exporteren als bestand. Ik krijg het nu alleen even niet voor elkeer om 1 tabel te maken van alle foreach'jes.
Ik krijg 6 dagen lang 3 bestanden per dag binnen, ik wil dus van de 15 bestanden de datum en aantallen in 1 tabel.
Ik zat zelf al even te kijken om de variable in een property te zetten en vervolgens een object aan te maken maar dan krijg ik 18 kleine tabbelen onder elkaar in 1 bestand.
Oké, een nieuw object aanmaken werkt wel alleen wil ik hem nu uitbreiden. Ik ben van 2 properties naar 10 properties gegaan. Tot 4 properties zet hij het mooi in 1 tabel alleen vanaf 5 of meer in allemaal nieuwe tabbelen. Iemand een idee?
1-4
Ik heb een foreach loopje die van alle bestanden in een map bepaalde strings ophaalt, alle bestanden zijn het zelfde. Ik zet de strings in een variable zodat ik er later iets mee kan.
Nu wil ik van al deze bestanden en variable 1 tabel maken en dit exporteren als bestand. Ik krijg het nu alleen even niet voor elkeer om 1 tabel te maken van alle foreach'jes.
Ik krijg 6 dagen lang 3 bestanden per dag binnen, ik wil dus van de 15 bestanden de datum en aantallen in 1 tabel.
Ik zat zelf al even te kijken om de variable in een property te zetten en vervolgens een object aan te maken maar dan krijg ik 18 kleine tabbelen onder elkaar in 1 bestand.
Edit:foreach ($f in $files) {
[string]$string= (get-content "$f") | Select-String -Pattern "datum"
$datum= $string.Substring(7)
[string]$string= (get-content "$f") | Select-String -Pattern "aantal"
$aantal= $string.Substring(20)
}
Oké, een nieuw object aanmaken werkt wel alleen wil ik hem nu uitbreiden. Ik ben van 2 properties naar 10 properties gegaan. Tot 4 properties zet hij het mooi in 1 tabel alleen vanaf 5 of meer in allemaal nieuwe tabbelen. Iemand een idee?
Het verschil:$prop= @{
Datum = $datum
Aantal= $aantal
opt1 = $opt1
opt2= $opt2
opt3= $opt3
opt4= $opt4
opt5 = $opt5
opt6= $opt6
opt7= $opt7
opt8= $opt8
}
$obj= New-Object psobject -Property $prop
1-4
1-5>opt1 opt2 Datum Aantal
---------- ----------- ----- ------
* ****** 2020-01-15 3
* ****** 2020-01-15 3
* ****** 2020-01-16 3
opt1: *
opt2: *****
Datum : 2020-01-20
opt3: *****
Aantal : 2
opt1: *
opt2: *****
Datum : 2020-01-20
opt3: *****
Aantal : 3
etc. etc.
[ Voor 31% gewijzigd door mswp op 21-01-2020 16:25 ]
😲
Kijk eens naar Format-List vs Format-Table. Het is maar een weergave. Boven een bepaald aantal properties zal PowerShell ze niet meer als een tabel tonen maar als een lijst van properties. Zint de standaard weergave je niet dan kun je formatteren met Format-List en Format-Table.mswp schreef op dinsdag 21 januari 2020 @ 16:11:
hmm, ik kom er even niet op. Mag ik jullie vragen om mee te denken?
Ik heb een foreach loopje die van alle bestanden in een map bepaalde strings ophaalt, alle bestanden zijn het zelfde. Ik zet de strings in een variable zodat ik er later iets mee kan.
Nu wil ik van al deze bestanden en variable 1 tabel maken en dit exporteren als bestand. Ik krijg het nu alleen even niet voor elkeer om 1 tabel te maken van alle foreach'jes.
Ik krijg 6 dagen lang 3 bestanden per dag binnen, ik wil dus van de 15 bestanden de datum en aantallen in 1 tabel.
Ik zat zelf al even te kijken om de variable in een property te zetten en vervolgens een object aan te maken maar dan krijg ik 18 kleine tabbelen onder elkaar in 1 bestand.
[...]
Edit:
Oké, een nieuw object aanmaken werkt wel alleen wil ik hem nu uitbreiden. Ik ben van 2 properties naar 10 properties gegaan. Tot 4 properties zet hij het mooi in 1 tabel alleen vanaf 5 of meer in allemaal nieuwe tabbelen. Iemand een idee?
[...]
Het verschil:
1-4
[...]
1-5>
[...]
Ja dat heb ik ook wel geprobeerd maar dan krijg ik dus van elk item in de array die ik foreach een eigen tabel.downtime schreef op dinsdag 21 januari 2020 @ 21:03:
[...]
Kijk eens naar Format-List vs Format-Table. Het is maar een weergave. Boven een bepaald aantal properties zal PowerShell ze niet meer als een tabel tonen maar als een lijst van properties. Zint de standaard weergave je niet dan kun je formatteren met Format-List en Format-Table.
Ik zou natuurlijk de output in een variable kunnen zetten en buiten de foreach loop om kunnen formatten.. ga ik zo eens proberen!
😲
Ik denk dat je wat meer code moet laten zien. Zo kan ik er weinig van zeggen. Maar normaal gesproken wil je de array met objecten in één keer aan Format-Table geven.mswp schreef op woensdag 22 januari 2020 @ 07:58:
[...]
Ja dat heb ik ook wel geprobeerd maar dan krijg ik dus van elk item in de array die ik foreach een eigen tabel.
Ik zou natuurlijk de output in een variable kunnen zetten en buiten de foreach loop om kunnen formatten.. ga ik zo eens proberen!
Dus zoiets: $Array | Format-Table
Je zou iets kunnen doen met een hashtable. Het is even geleden dus ik weet niet of hij direct klopt. Maar je kunt hiermee iteratief een hashtable aanmaken.downtime schreef op woensdag 22 januari 2020 @ 08:43:
[...]
Ik denk dat je wat meer code moet laten zien. Zo kan ik er weinig van zeggen. Maar normaal gesproken wil je de array met objecten in één keer aan Format-Table geven.
Dus zoiets: $Array | Format-Table
code:
1
2
3
4
5
6
| $Array | ForEach-Object { $Waarde += [PSCustomObject]@{ Key = Value } } |
@downtime @Galukon
Dit is het script wat ik tot nu toe heb.
Dit is het script wat ik tot nu toe heb.
Met dit als uitkomst$dir= "C:\Users\opt\Desktop\opt1\"
$files= Get-ChildItem $dir
foreach ($f in $files) {
[string]$string= (get-content "$f") | Select-String -Pattern "datum"
$datum= $string.Substring(7)
[string]$string= (get-content "$f") | Select-String -Pattern "Aantal"
$aantal= $string.Substring(20)
[string]$string= (get-content "$f") | Select-String -Pattern "opt1"
$opt1= $string.Substring(9)
[string]$string= (get-content "$f") | Select-String -Pattern "opt2"
$opt2= $string.Substring(5)
[string]$string= (get-content "$f") | Select-String -Pattern "opt3"
$opt3= $string.Substring(
[string]$string= (get-content "$f") | Select-String -Pattern "opt4"
$op4= $string.Substring(9)
[string]$string= (get-content "$f") | Select-String -Pattern "opt5"
$op5= $string.Substring(6)
[string]$string= (get-content "$f") | Select-String -Pattern "opt6"
$op6= $string.Substring(11)
[string]$string= (get-content "$f") | Select-String -Pattern "opt7"
$opt7= $string.Substring(15)
[string]$string= (get-content "$f") | Select-String -Pattern "opt8"
$opt8= $string.Substring(12)
[string]$string= (get-content "$f") | Select-String -Pattern "opt9"
$opt9= $string.Substring(12)
$props= @{
datum = $datum
aantal = $aantalmedewerkers
opt1 = $opt1
opt2 = $opt2
opt3 = $opt3
opt4 = $opt4
opt5 = $opt5
opt6 = $opt6}
$obj = New-Object psobject -Property $props
$obj | Format-Table
}
datum opt1 opt2 opt3 opt4 opt5 opt6 aantal
----- ------- ---- ------- --- ------ ------
2020-01-15 **** **** **** ***** *****
datum opt1 opt2 opt3 opt4 opt5 opt6 aantal
----- ------- ---- ------- --- ------ ------
2020-01-15 **** **** **** **** 3 *****
datum opt1 opt2 opt3 opt4 opt5 opt6 aantal
----- ------- ---- ------- --- ------ ------
2020-01-16 ***** 11 ***** ***** 3 *****
datum opt1 opt2 opt3 opt4 opt5 opt6 aantal
----- ------- ---- ------- --- ------ ------
2020-01-16 ***** 10,5 ***** ***** 3 *****
😲
Ik heb het niet getest maar dit zou beter moeten gaan. Je moet pas formatten als je de hele array met objecten hebt opgebouwd.mswp schreef op woensdag 22 januari 2020 @ 19:29:
@downtime @Galukon
Dit is het script wat ik tot nu toe heb.
[...]
PowerShell:
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
46
47
48
49
50
51
52
53
54
| $dir= "C:\Users\opt\Desktop\opt1\" $files= Get-ChildItem $dir $array = @() foreach ($f in $files) { [string]$string= (get-content "$f") | Select-String -Pattern "datum" $datum= $string.Substring(7) [string]$string= (get-content "$f") | Select-String -Pattern "Aantal" $aantal= $string.Substring(20) [string]$string= (get-content "$f") | Select-String -Pattern "opt1" $opt1= $string.Substring(9) [string]$string= (get-content "$f") | Select-String -Pattern "opt2" $opt2= $string.Substring(5) [string]$string= (get-content "$f") | Select-String -Pattern "opt3" $opt3= $string.Substring(8) [string]$string= (get-content "$f") | Select-String -Pattern "opt4" $op4= $string.Substring(9) [string]$string= (get-content "$f") | Select-String -Pattern "opt5" $op5= $string.Substring(6) [string]$string= (get-content "$f") | Select-String -Pattern "opt6" $op6= $string.Substring(11) [string]$string= (get-content "$f") | Select-String -Pattern "opt7" $opt7= $string.Substring(15) [string]$string= (get-content "$f") | Select-String -Pattern "opt8" $opt8= $string.Substring(12) [string]$string= (get-content "$f") | Select-String -Pattern "opt9" $opt9= $string.Substring(12) $props= @{ datum = $datum aantal = $aantalmedewerkers opt1 = $opt1 opt2 = $opt2 opt3 = $opt3 opt4 = $opt4 opt5 = $opt5 opt6 = $opt6 } $array += New-Object psobject -Property $props } $array | Format-Table |
Klinkt logisch, ga ik zo eens testen.downtime schreef op woensdag 22 januari 2020 @ 19:49:
[...]
Ik heb het niet getest maar dit zou beter moeten gaan. Je moet pas formatten als je de hele array met objecten hebt opgebouwd.
PowerShell:
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 46 47 48 49 50 51 52 53 54 $dir= "C:\Users\opt\Desktop\opt1\" $files= Get-ChildItem $dir $array = @() foreach ($f in $files) { [string]$string= (get-content "$f") | Select-String -Pattern "datum" $datum= $string.Substring(7) [string]$string= (get-content "$f") | Select-String -Pattern "Aantal" $aantal= $string.Substring(20) [string]$string= (get-content "$f") | Select-String -Pattern "opt1" $opt1= $string.Substring(9) [string]$string= (get-content "$f") | Select-String -Pattern "opt2" $opt2= $string.Substring(5) [string]$string= (get-content "$f") | Select-String -Pattern "opt3" $opt3= $string.Substring(8) [string]$string= (get-content "$f") | Select-String -Pattern "opt4" $op4= $string.Substring(9) [string]$string= (get-content "$f") | Select-String -Pattern "opt5" $op5= $string.Substring(6) [string]$string= (get-content "$f") | Select-String -Pattern "opt6" $op6= $string.Substring(11) [string]$string= (get-content "$f") | Select-String -Pattern "opt7" $opt7= $string.Substring(15) [string]$string= (get-content "$f") | Select-String -Pattern "opt8" $opt8= $string.Substring(12) [string]$string= (get-content "$f") | Select-String -Pattern "opt9" $opt9= $string.Substring(12) $props= @{ datum = $datum aantal = $aantalmedewerkers opt1 = $opt1 opt2 = $opt2 opt3 = $opt3 opt4 = $opt4 opt5 = $opt5 opt6 = $opt6 } $array += New-Object psobject -Property $props } $array | Format-Table
😲
@downtime
hmm.. foutmelding terug en vervolgens van de laatste array een tabel format terug.
hmm.. foutmelding terug en vervolgens van de laatste array een tabel format terug.
Method invocation failed because [System.Management.Automation.PSObject] does not contain a method named 'op_Addition'.
At C:\Users\opt1\Desktop\opt1\Untitled1.ps1:48 char:1
+ $array += New-Object psobject -Property $props
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (op_Addition:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
😲
Heb je de opdracht $array = @() wel toegevoegd op de derde regel?mswp schreef op woensdag 22 januari 2020 @ 21:24:
@downtime
hmm.. foutmelding terug en vervolgens van de laatste array een tabel format terug.
[...]
Dat was hem inderdaad, werkt! Thanks!downtime schreef op woensdag 22 januari 2020 @ 21:48:
[...]
Heb je de opdracht $array = @() wel toegevoegd op de derde regel?
😲
mand.. ;-)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| $dir= 'C:\Temp\bla\' $files= Get-ChildItem -Path $dir -File $list = foreach ($f in $files){ $text = Get-Content -Path $f.FullName $obj = [PSCustomObject]@{ datum = ($text | Select-String 'datum').ToString().Substring(7) aantal = ($text | Select-String 'aantal').ToString().Substring(7) opt1 = ($text | Select-String 'opt1').ToString().Substring(7) } $obj } $list |
[ Voor 11% gewijzigd door Frost_Azimov op 23-01-2020 11:23 ]
Een paar opmerkingen over bovenstaande:
regel1: best practice is om ' i.p.v. " te gebruiken als je wilt dat de string immutable is.
regel 4: waarom niet lekker een simpele array? Op deze manier kun je 'add' gebruiken i.p.v. +=, bij += wordt steeds de array terug opgebouwd, maar hier wordt alleen een element toegevoegd: major tijdwinst. Je 'array' is nu eigenlijk een list waar je dynamisch objecten aan kunt toevoegen. Het toevoegen gebeurd omdat je $obj naar buiten poept in je foreach block, dat wordt dus in de $list ge-'add'.
regel 5: volgens mij hoef je het bestand maar een keer in te lezen, je 'oude' code leest elke keer hetzelfde bestand in dezelfde variabele. overigens zou het nog netter zijn als je je path eerst test en het lezen in een try/catch block doet. De best practice rule of thumb om dit te doen is: als je programma iets 'buiten zijn eigen omgeving doet' (en dat doet tie hiet, hij gaat immers de wijde wereld in op zoek mnaar bestanden die er wel of niet (buiten jouw controle) kunnen zijn)
regel 6: dit is een wat makkelijkere methode om een object te maken
regel1: best practice is om ' i.p.v. " te gebruiken als je wilt dat de string immutable is.
regel 4: waarom niet lekker een simpele array? Op deze manier kun je 'add' gebruiken i.p.v. +=, bij += wordt steeds de array terug opgebouwd, maar hier wordt alleen een element toegevoegd: major tijdwinst. Je 'array' is nu eigenlijk een list waar je dynamisch objecten aan kunt toevoegen. Het toevoegen gebeurd omdat je $obj naar buiten poept in je foreach block, dat wordt dus in de $list ge-'add'.
regel 5: volgens mij hoef je het bestand maar een keer in te lezen, je 'oude' code leest elke keer hetzelfde bestand in dezelfde variabele. overigens zou het nog netter zijn als je je path eerst test en het lezen in een try/catch block doet. De best practice rule of thumb om dit te doen is: als je programma iets 'buiten zijn eigen omgeving doet' (en dat doet tie hiet, hij gaat immers de wijde wereld in op zoek mnaar bestanden die er wel of niet (buiten jouw controle) kunnen zijn)
regel 6: dit is een wat makkelijkere methode om een object te maken
[ Voor 25% gewijzigd door Frost_Azimov op 23-01-2020 11:27 ]
Thanks voor deze uitgebreide tips! Ik ga er morgens eens goed naar kijken!Frost_Azimov schreef op donderdag 23 januari 2020 @ 10:30:
Een paar opmerkingen over bovenstaande:
regel1: best practice is om ' i.p.v. " te gebruiken als je wilt dat de string immutable is.
regel 4: waarom niet lekker een simpele array? Op deze manier kun je 'add' gebruiken i.p.v. +=, bij += wordt steeds de array terug opgebouwd, maar hier wordt alleen een element toegevoegd: major tijdwinst. Je 'array' is nu eigenlijk een list waar je dynamisch objecten aan kunt toevoegen. Het toevoegen gebeurd omdat je $obj naar buiten poept in je foreach block, dat wordt dus in de $list ge-'add'.
regel 5: volgens mij hoef je het bestand maar een keer in te lezen, je 'oude' code leest elke keer hetzelfde bestand in dezelfde variabele. overigens zou het nog netter zijn als je je path eerst test en het lezen in een try/catch block doet. De best practice rule of thumb om dit te doen is: als je programma iets 'buiten zijn eigen omgeving doet' (en dat doet tie hiet, hij gaat immers de wijde wereld in op zoek mnaar bestanden die er wel of niet (buiten jouw controle) kunnen zijn)
regel 6: dit is een wat makkelijkere methode om een object te maken
😲
Laatst een progress bar gebouwd, kom ik er later achter dat dit standaard in Powershell zit
Totdat je met VSCode aan de slag gaat, voorlopig is tie daar weer foetsie, dus bewaar je code!raptorix schreef op maandag 27 januari 2020 @ 12:41:
Laatst een progress bar gebouwd, kom ik er later achter dat dit standaard in Powershell zit
Mjah, gebruik VSCode eigenlijk nooit, vind de Powershell IDE prima, en de progressbar was een aardigheidje voor in een Devops Pipeline.Frost_Azimov schreef op maandag 27 januari 2020 @ 15:35:
[...]
Totdat je met VSCode aan de slag gaat, voorlopig is tie daar weer foetsie, dus bewaar je code!
Wellicht totdat je de voordelen van VScode op een rijtje zet:raptorix schreef op dinsdag 28 januari 2020 @ 10:51:
[...]
Mjah, gebruik VSCode eigenlijk nooit, vind de Powershell IDE prima...
Extensions, Naast de, in deze context, verplichte powershell extension (waarmee syntax highlighting werkt) zijn er legio andere nuttige uitbreidingen; bijvoorbeeld "Bracket Pair Colorizer", deze kleurt brackets van "foreach" en "if" statements. zodat bij geneste statements in 1 oogopslag kan zien op welk niveau een bracket hoort. Als er ergens 1 ontbreekt dan kloppen de kleuren niet en is het snel terug te vinden waar er iets mis gaat. Zo zijn er vele extensions.
Selecteren van een variabele "highlight" alle instanties van die variabele in de code. Daarnaast wordt in de scrollbar van het code scherm, blokjes weer gegeven waar die variabele nog meer voorkomt in de openstaande code.
Ingebouwde text vergelijk tool, stel 2 versies van een script en je weet niet wat het verschil is. Dan is dat met de text vergelijk tool vanuit VScode meteen te zien.
Ingebouwde versie beheer. wordt pas nuttig bij complexere scripts, maar het autoamtisch bijhouden van versies en github intergratie is meesterlijk.
VSCode "Open Folder" stelt je instaat een set scripts die bij elkaar hoort te openen.
Dit stelt je instaat om over alle bestanden in die folder alle referenties naar een variabele, of functie te vinden (select variable, rechts klik, find all references).
ook dit is pas nuttig bij completere script met meerdere files, maar onmisbaar op die schaal.
Debuggen is completer, net als is ISE een breakpunt instellen met F9. Als de code gestart wordt en aankomt bij het breek punt. is aan de linker kant een overzichht te zien van alle variabele een hun waardes. ook erg handig
Er zijn nog talloze andere voordelen afghankelijk van je code stijl. maar bovenstaande waren de features die mij deden overschakelen naar VSCode.
Heeft het alleen voordelen? nee ik heb 1 nadeel
Bij mij crashed debugging nog wel eens als ik de VMware module powercli heb geladen. dan crashed de PS console in VScode.
Ik mag graag de PowerShell Conf europe bijwonen, waar ook het MS PowerShell dev team elk jaar langskomt onder begeleiding van Jeffrey Snover (maker PowerShell). De laatste paar jaar kun je zien dat die gasten allemaal 'over' zijn naar VSCode voor PowerShell ontwikkeling. In fact; er zullen verder geen ontwikkelingen in ISE zijn, de development is stopgezet. (is me daar mede gedeeld)
Tot een jaar geleden gebruikte ik ook graag ISE, en dan wel in combinatie met ISE-Steroids, maar ik moet toegeven dat VSCode in de meeste gevallen nu ook mijn go-to IDE is. Met name revision control is inderdaad erg fijn zoals Semt-x ook al aangeeft.
Ik kan me voorstellen dat je misschien niet dagelijks met PowerShell bezig bent, en dan is het handig dat ISE op elk systeem (ook Server 2019 nog steeds) beschikbaar is. Maar als je dagelijks met PowerShell aan de slag gaat/bent (al helemaal met de core / 7 versions) dan is VSCode on-ontbeerlijk.
Maar ja... die Progress bar he....
Tot een jaar geleden gebruikte ik ook graag ISE, en dan wel in combinatie met ISE-Steroids, maar ik moet toegeven dat VSCode in de meeste gevallen nu ook mijn go-to IDE is. Met name revision control is inderdaad erg fijn zoals Semt-x ook al aangeeft.
Ik kan me voorstellen dat je misschien niet dagelijks met PowerShell bezig bent, en dan is het handig dat ISE op elk systeem (ook Server 2019 nog steeds) beschikbaar is. Maar als je dagelijks met PowerShell aan de slag gaat/bent (al helemaal met de core / 7 versions) dan is VSCode on-ontbeerlijk.
Maar ja... die Progress bar he....
[ Voor 25% gewijzigd door Frost_Azimov op 28-01-2020 16:19 ]
@Semt-x dat zijn idd handige features, ik moet zeggen dat ik eigelijk powershell met name gebruik voor kleine stukjes release pipeline, dus echt debuggen hoef ik maar zelden. Ik ben zelf van huis (.net) developer dus herken de voordelen wel 
Overigens heb ik laatst dit script gemaakt, ben nog bezig met uitbreiding, maar is handig om je resource groupen in kaart te brengen.
Overigens heb ik laatst dit script gemaakt, ben nog bezig met uitbreiding, maar is handig om je resource groupen in kaart te brengen.
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
| $output = Get-AzResource -ResourceGroupName bladiebla $data = "" $data += "|Name|Type|Description|"+ "`r`n" $data += "|--|--|--|"+ "`r`n" foreach ($item in $output) { $details = ""; $ignore = $false; try{ switch -Wildcard ($item.ResourceType) { 'Microsoft.Compute/virtualMachines/extensions' { $details = 'extention for ' + $item.ParentResource } 'Microsoft.KeyVault/vaults' { $kv = Get-AzKeyVault -VaultName $item.name -ResourceGroupName $item.ResourceGroupName $keys = Get-AzKeyVaultKey -VaultName $item.Name $secret = Get-AzKeyVaultSecret -VaultName $item.Name $details = $item.Tags.purpose + ' (Keys:' + $keys.Count + ' Secrets: ' + $secret.Count + ') Softdelete: ' + $kv.EnableSoftDelete; } 'Microsoft.Network/networkInterfaces' { $nic = Get-AzNetworkInterface -ResourceId $item.ResourceId if($nic.VirtualMachine){ $shortname = $nic.VirtualMachine.Id.Split('/'); $details = 'NIC for ' + $shortname[$shortname.Length-1] } else{ $details = '<font color="red">Unattached</font>' } } 'Microsoft.Compute/disks' { $disk = Get-AzDisk -DiskName $item.Name if($disk.ManagedBy){ $vm = $disk.ManagedBy.Split('/'); $details = 'Disk for ' + $vm[$vm.Length-1] + ' ' + $disk.DiskSizeGB + ' GB ' + ' ' + $disk.Sku.Name } else{ $details = '<font color="red">Unattached</font>' } } '*/databases' { $details = 'Database hosted on ' + $item.Name.Split('/')[0]; } 'Microsoft.Network/virtualNetworks' { $vn = Get-AzVirtualNetwork -Name $item.Name -ResourceGroupName $item.ResourceGroupName $details = 'Vnet space: ' + $vn.AddressSpace.AddressPrefixesText; } 'Microsoft.Network/networkIntentPolicies' { $details = 'Network intent policies' } 'Microsoft.Network/networkSecurityGroups' { $nsg = Get-AzNetworkSecurityGroup -Name $item.Name -ResourceGroupName $item.ResourceGroupName if($nsg.SubnetsText -ne '[]'){ $details = 'Asociated with: ' + $nsg.SubnetsText } if($nsg.NetworkInterfacesText){ $details += ' ' + $nsg.NetworkInterfacesText } } default { $details = $item.Tags.purpose } } } catch{ write-host "Caught an exception:" -ForegroundColor Red write-host $item.Name write-host "Exception Type: $($_.Exception.GetType().FullName)" -ForegroundColor Red write-host "Exception Message: $($_.Exception.Message)" -ForegroundColor Red } if (!$ignore){ $data += '|' + $item.Name + '|' + $item.ResourceType + '|' + $details + '|' + "`r`n"; } } Write-Host $data Out-File -FilePath 'c:\\temp\resources.txt' -InputObject $data |
Heeft iemand het al eens voor elkaar gekregen om een gerenderde html pagina te "printen" naar PDF? ik zoek me suf.. 
Of omdenken, een pdf maken met de opmaak van een html tabel met titel en logo?

Of omdenken, een pdf maken met de opmaak van een html tabel met titel en logo?
[ Voor 25% gewijzigd door mswp op 21-02-2020 15:10 ]
😲
Kun je niet iets met het cmdlet "out-printer" en dan de info naar een PDF-printer toesturen?
MCSE NT4/2K/2K3, MCTS, MCITP, CCA, CCEA, CCEE, CCIA, CCNA, CCDA, CCNP, CCDP, VCP, CEH + zwemdiploma A & B
Ja daar ben ik al mee bezig geweest, dat werkt perfect alleen renderd hij de html pagina niet. Hij print dan de html code.Question Mark schreef op vrijdag 21 februari 2020 @ 15:16:
Kun je niet iets met het cmdlet "out-printer" en dan de info naar een PDF-printer toesturen?
Nu zou ik kunnen zeggen geen html te gebruiken maar dan is de layout zo kaal.. en geen logo op het rapport.
[ Voor 3% gewijzigd door mswp op 21-02-2020 15:24 ]
😲
Ik denk dat je een aanvullende tool nodig hebt. Kun je Powershell niet gebruiken om een browser te openen en die de HTML te laten renderen en uitprinten? Zo lijkt Chrome een —print-to-pdf optie te hebben.mswp schreef op vrijdag 21 februari 2020 @ 15:23:
[...]
Ja daar ben ik al mee bezig geweest, dat werkt perfect alleen renderd hij de html pagina niet. Hij print dan de html code.
Ja daar ben ik ook bang voor..downtime schreef op vrijdag 21 februari 2020 @ 16:10:
[...]
Ik denk dat je een aanvullende tool nodig hebt. Kun je Powershell niet gebruiken om een browser te openen en die de HTML te laten renderen en uitprinten? Zo lijkt Chrome een —print-to-pdf optie te hebben.
Hmm..
1. Open html in chrome
2. Send request to plugin
3. Save as .pdf
Kan je chrome aansturen met powershell?
😲
Snelle Google-actie gaf mij de indruk dat je het via command line kunt aanroepen en dan ook meteen pagina opgeven en parameter om die naar PDF te printen.mswp schreef op vrijdag 21 februari 2020 @ 16:20:
[...]
Ja daar ben ik ook bang voor..
Hmm..
1. Open html in chrome
2. Send request to plugin
3. Save as .pdf
Kan je chrome aansturen met powershell?
Internet Explorer COM object aanmaken, HTML file openen en dan printen naar pdf?mswp schreef op vrijdag 21 februari 2020 @ 15:23:
[...]
Ja daar ben ik al mee bezig geweest, dat werkt perfect alleen renderd hij de html pagina niet. Hij print dan de html code.
Nu zou ik kunnen zeggen geen html te gebruiken maar dan is de layout zo kaal.. en geen logo op het rapport.
Of Word via interop openen en het daarmee doen.
Dat zijn de eerste dingen die in mij opkomen om te proberen.
{{sorry verkeerde topic}}
[ Voor 85% gewijzigd door Turdie op 25-02-2020 18:35 ]
@Killah_Priest
Volgende uitdaging is nu titel, htmltable en url onderaan van de pagina afkrijgen.
Gelukt, het volgende aan de CSS toegevoegd;
En ik zit nog te kijken waar ik dit script wil laten draaien, eigenlijk op een linux servertje maar dan gaat het chrome proces niet werken. Ik heb bij de klant geen Windows server o.i.d. draaien.
Chrome heeft hier wel een mooie functie voor inderdaad, ik doe het nu met:downtime schreef op vrijdag 21 februari 2020 @ 17:08:
[...]
Snelle Google-actie gaf mij de indruk dat je het via command line kunt aanroepen en dan ook meteen pagina opgeven en parameter om die naar PDF te printen.
code:
1
| & 'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe' --headless --disable-gpu --print-to-pdf=c:\temp\file1.pdf 'C:\Users\user1\Desktop\test\Report\2020-8.html' |
Volgende uitdaging is nu titel, htmltable en url onderaan van de pagina afkrijgen.
Gelukt, het volgende aan de CSS toegevoegd;
code:
1
2
3
4
| @media print { @page { margin: 0; } body { margin: 1.6cm; } } |
En ik zit nog te kijken waar ik dit script wil laten draaien, eigenlijk op een linux servertje maar dan gaat het chrome proces niet werken. Ik heb bij de klant geen Windows server o.i.d. draaien.
[ Voor 7% gewijzigd door mswp op 02-03-2020 14:57 ]
😲
Wij gebruiken hier, vanuit development dan wel, een pdf generator tool in een docker container. Dit is effectief een headless chrome instance met wat tweaks en tooling erom heen. Ik zal morgen is bij de devs informeren hoe en wat.mswp schreef op maandag 2 maart 2020 @ 14:36:
@Killah_Priest
[...]
Chrome heeft hier wel een mooie functie voor inderdaad, ik doe het nu met:
code:
1 & 'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe' --headless --disable-gpu --print-to-pdf=c:\temp\file1.pdf 'C:\Users\user1\Desktop\test\Report\2020-8.html'
Volgende uitdaging is nu titel, htmltable en url onderaan van de pagina afkrijgen.
Gelukt, het volgende aan de CSS toegevoegd;
code:
1 2 3 4 @media print { @page { margin: 0; } body { margin: 1.6cm; } }
En ik zit nog te kijken waar ik dit script wil laten draaien, eigenlijk op een linux servertje maar dan gaat het chrome proces niet werken. Ik heb bij de klant geen Windows server o.i.d. draaien.
Even een 'snelle' vraag. Weet iemand hoe ik de opmaak van een .txt makkelijk in een messagebox kan tonen? Ik krijg het in de messagebox maar ik wil de alineas/tabs ook in het bericht krijgen.
Ik krijg met `n wel elke regel op een nieuwe lijn maar niet een `0 regel ertussen.
test.txt:
[System.Windows.MessageBox]::Show($content)
Ik krijg met `n wel elke regel op een nieuwe lijn maar niet een `0 regel ertussen.
test.txt:
$content= get-content "c:\huppelepup\test.txt"welkom
dit is een test
bedankt.
[System.Windows.MessageBox]::Show($content)
😲
$content= get-content "c:\huppelepup\test.txt" -Raw
[System.Windows.MessageBox]::Show($content)
[System.Windows.MessageBox]::Show($content)
Dat is het, thanks!Semt-x schreef op vrijdag 27 maart 2020 @ 16:27:
$content= get-content "c:\huppelepup\test.txt" -Raw
[System.Windows.MessageBox]::Show($content)
😲
Voor degene die VSCode gebruiken, ik ben wel benieuwd welke extensies iedereen gebruikt die het scripten met PowerShell makkelijker maken, dus kom maar door. En standaard PowerShell extensie hoef je natuurlijk niet te vermelden
ik Bracket Pair Colorizer alleenshadowman12 schreef op vrijdag 27 maart 2020 @ 16:35:
Voor degene die VSCode gebruiken, ik ben wel benieuwd welke extensies iedereen gebruikt die het scripten met PowerShell makkelijker maken, dus kom maar door. En standaard PowerShell extensie hoef je natuurlijk niet te vermelden
[ Voor 3% gewijzigd door mswp op 27-03-2020 16:37 ]
😲
@shadowman12 Ik gebruik er maar 1 extra: Bracket Pair Colorizer
Toevallig ook nog een idee hoe ik dit ga vertalen naar een JSON voor een api bericht?Semt-x schreef op vrijdag 27 maart 2020 @ 16:27:
$content= get-content "c:\huppelepup\test.txt" -Raw
[System.Windows.MessageBox]::Show($content)
😲
Als ik weet voor welke API wel. Ik weet niet wat die API voor JSON data verwacht.
Kan prima met wkhtmltopdf:mswp schreef op vrijdag 21 februari 2020 @ 15:10:
Heeft iemand het al eens voor elkaar gekregen om een gerenderde html pagina te "printen" naar PDF? ik zoek me suf..
Of omdenken, een pdf maken met de opmaak van een html tabel met titel en logo?
https://grantquick.wordpr...rt-html-to-pdf-qt-webkit/
[ Voor 15% gewijzigd door Turdie op 27-03-2020 17:57 ]
Webhook/teamsSemt-x schreef op vrijdag 27 maart 2020 @ 16:43:
Als ik weet voor welke API wel. Ik weet niet wat die API voor JSON data verwacht.
😲
Voorzover ik weet kun je geen messagebox naar Teams sturen (ik zou ook niet inzien hoe zoiets überhaupt mogelijk zou zijn). Of gaat het om de inhoud van een textbestand via een webhook te posten in een teams bericht? Dat is namelijk erg eenvoudig om te doen (in de documentatie van MS staat hoe de json payload eruit moet zien)
Ja klopt, ik kring het ook wel voor elkaar om tekst te sturen alleen wil ik alinia's/witregels meegenomen hebben vanuit de txt en dar doet hij niet. Hij plakt alles achter elkaar.Killah_Priest schreef op zaterdag 28 maart 2020 @ 09:14:
[...]
Voorzover ik weet kun je geen messagebox naar Teams sturen (ik zou ook niet inzien hoe zoiets überhaupt mogelijk zou zijn). Of gaat het om de inhoud van een textbestand via een webhook te posten in een teams bericht? Dat is namelijk erg eenvoudig om te doen (in de documentatie van MS staat hoe de json payload eruit moet zien)
😲
Niet 1 op 1 bruikbaar, maar misschien kun je hier wat inspiratie vandaan halen: https://www.scriptinglibr...ft-teams-with-powershell/
@new_guy Dat lukt mij allemaal ook al wel het probleem waar ik tegenaan loop is het volgende:
dit is mijn txt:
en de newline achter :
dit is mijn txt:
dit is mijn script:welkom
dit is een test:
- regel 1
- regel 2
bedankt.
Dit is de uitkomst, ik mis de witregels$content= get-content "c:\huppelepup\test.txt"
$JSONBody = [PSCustomObject][Ordered]@{
"@type" = "MessageCard"
"themeColor" = 'cc1418'
"title" = "test"
"text" = "$content"
}
$TeamMessageBody = ConvertTo-Json $JSONBody -Depth 100
$parameters = @{
"URI" = '*********************
"Method" = 'POST'
"Body" = $TeamMessageBody
"ContentType" = 'application/json'
}
Invoke-RestMethod @parameters

welkom
dit is een test: - regel 1 - regel 2
bedankt.
😲
Ik heb het zelf net werkend gekregen met:
https://stackoverflow.com...ne-into-ms-teams-markdown
code:
1
| "There is a problem with Push notifications.<br><br>They don't seem to be picked up by the connector." |
https://stackoverflow.com...ne-into-ms-teams-markdown
Dat is hem inderdaad, thanks!new_guy schreef op zaterdag 28 maart 2020 @ 11:36:
Ik heb het zelf net werkend gekregen met:
code:
1 "There is a problem with Push notifications.<br><br>They don't seem to be picked up by the connector."
https://stackoverflow.com...ne-into-ms-teams-markdown
<br> is een newline.
😲
Weet er iemand een goede website of pocket guide boek waar je de meest gebruikte commands van PowerShell kan opzoeken met voorbeelden. Ik wil met PowerShell aan de slag gaan, heb al voorbeelden op internet gevonden van commands die ik kan gebruiken maar 100% wat ik nodig heb ben ik nog niet tegen gekomen. Ik zou graag het zelf kunnen aanpassen naar wat ik effectief nodig heb.
Learn PowerShell in a Month of Lunches van Don JonesR009 schreef op maandag 30 maart 2020 @ 20:06:
Weet er iemand een goede website of pocket guide boek waar je de meest gebruikte commands van PowerShell kan opzoeken met voorbeelden. Ik wil met PowerShell aan de slag gaan, heb al voorbeelden op internet gevonden van commands die ik kan gebruiken maar 100% wat ik nodig heb ben ik nog niet tegen gekomen. Ik zou graag het zelf kunnen aanpassen naar wat ik effectief nodig heb.
Dit boek was ook een van de eerste die vermeld werd in dit topic. Heb je toevallig het boek al gelezen? Ben bvb opzoek naar hoe je Start-Process kan gebruiken en alle varianten erop.shadowman12 schreef op maandag 30 maart 2020 @ 20:11:
[...]
Learn PowerShell in a Month of Lunches van Don Jones
Ja goed boekR009 schreef op maandag 30 maart 2020 @ 20:15:
[...]
Dit boek was ook een van de eerste die vermeld werd in dit topic. Heb je toevallig het boek al gelezen? Ben bvb opzoek naar hoe je Start-Process kan gebruiken en alle varianten erop.
Maar je kunt ook dit doen
PowerShell:
1
| Get-Help Start-Process -Full |
Dat een van de eerste commando die je moet leren. Get-Help is enorm krachtig om vanuit de shell zelf over (bijna) iedere cmdlet informatie op te zoeken. Volgens mij is er inmiddels ook een YouTube playlist van Learn PowerShell in a Month of Lunches, dan krijg een indruk.
[ Voor 25% gewijzigd door Turdie op 30-03-2020 20:31 ]
Probeer eens met -Raw achter de Get-Content.mswp schreef op zaterdag 28 maart 2020 @ 11:02:
@new_guy Dat lukt mij allemaal ook al wel het probleem waar ik tegenaan loop is het volgende:
dit is mijn txt:
[...]
dit is mijn script:
[...]
Dit is de uitkomst, ik mis de witregelsen de newline achter :
[...]
Als je geen -Raw gebruikt, wordt er automatisch een array van gemaakt. Witte regels worden dan sowieso overgeslagen.
Weet je toevallig ook of er een pocket guide bestaat zoals voor Linux commando’s? Ik heb een pocket guide van Linux waar je alle commando’s kan opzoeken met voorbeelden.shadowman12 schreef op maandag 30 maart 2020 @ 20:29:
[...]
Ja goed boek
Maar je kunt ook dit doen
PowerShell:
1 Get-Help Start-Process -Full
Dat een van de eerste commando die je moet leren. Get-Help is enorm krachtig om vanuit de shell zelf over (bijna) iedere cmdlet informatie op te zoeken. Volgens mij is er inmiddels ook een YouTube playlist van Learn PowerShell in a Month of Lunches, dan krijg een indruk.
Ja heb zelf al gezocht?R009 schreef op zondag 5 april 2020 @ 08:32:
[...]
Weet je toevallig ook of er een pocket guide bestaat zoals voor Linux commando’s? Ik heb een pocket guide van Linux waar je alle commando’s kan opzoeken met voorbeelden.
Er is de Microsoft documentatie die eigenlijk hetzelfde is als de documentatie die je met Get-Help kunt krijgen. Get-Command, met de -Noun en -Verb parameters, leren gebruiken is ook erg nuttig.R009 schreef op zondag 5 april 2020 @ 08:32:
[...]
Weet je toevallig ook of er een pocket guide bestaat zoals voor Linux commando’s? Ik heb een pocket guide van Linux waar je alle commando’s kan opzoeken met voorbeelden.
Microsoft Press heeft weliswaar PowerShell Administrators Pocket Consultant maar die is oeroud (uit 2009) en dus verre van compleet. Ik heb dat boek en heb ‘m eigenlijk nooit gebruikt omdat Googlen sneller is dan opstaan en een boek uit de kast pakken.
"Discoverability" van de cmdlets is veel makkelijker dan in Unix en Linux, cmdlets zijn maximaal 15 jaar oud en de naam is altijd volgens een bepaalde standaard. Dus Get-Command *compliance* is vaak al voldoende om een cmdlet te vinden die iets met ComplianceSearch doet, als het me al niet lukt door gewoon beginnen met het typen van Get-compl... en dan tab-completion te gebruiken.R009 schreef op zondag 5 april 2020 @ 08:32:
[...]
Weet je toevallig ook of er een pocket guide bestaat zoals voor Linux commando’s? Ik heb een pocket guide van Linux waar je alle commando’s kan opzoeken met voorbeelden.
Voor daadwerkelijke uitleg over de werking gooi ik de naam van het cmdlet gewoon in Google, de eerste hit is doorgaans de officiële hulppagina. De inhoud moet overeenkomen met Get-Help maar ik vind het gewoon makkelijker navigeren.
Ik zoek ze ook altijd op. Get-Help is in mijn ogen redelijk ruk, vooral omdat de enkele keren dat ik het nodig heb (parameters en parameter types) ik eigenlijk altijd eerst update-help kan gaan draaien (waarbij ik weer moet elevaten in veel gevallen) om vervolgens een onoverzichtelijk geheel te krijgen.Jazzy schreef op zondag 5 april 2020 @ 13:34:
Voor daadwerkelijke uitleg over de werking gooi ik de naam van het cmdlet gewoon in Google, de eerste hit is doorgaans de officiële hulppagina. De inhoud moet overeenkomen met Get-Help maar ik vind het gewoon makkelijker navigeren.
Dan is het meestal toch sneller om gewoon even Google te gebruiken of bv Get-Command en dan alle parameters opzoeken met het datatype wat ze verwachten.
@shadowman12 anders zou ik de vraag niet stellen. Ik probeer hier op het forum relevante antwoorden te krijgen. Google geeft je miljoenen hits en dan weet je als leek nog niets...
@alleanderen: bedankt voor de reacties. De vraag is gewoon om een overzicht te hebben van de cmdlets aangezien ik die allemaal niet vanbuiten ken. Dan is het wel handig om een boek te hebben waar je eens kan doorgaan en te zoeken welke cmdlets er allemaal bestaan.
@alleanderen: bedankt voor de reacties. De vraag is gewoon om een overzicht te hebben van de cmdlets aangezien ik die allemaal niet vanbuiten ken. Dan is het wel handig om een boek te hebben waar je eens kan doorgaan en te zoeken welke cmdlets er allemaal bestaan.
Get-Command dus.R009 schreef op zondag 5 april 2020 @ 22:21:
@shadowman12 anders zou ik de vraag niet stellen. Ik probeer hier op het forum relevante antwoorden te krijgen. Google geeft je miljoenen hits en dan weet je als leek nog niets...
@alleanderen: bedankt voor de reacties. De vraag is gewoon om een overzicht te hebben van de cmdlets aangezien ik die allemaal niet vanbuiten ken. Dan is het wel handig om een boek te hebben waar je eens kan doorgaan en te zoeken welke cmdlets er allemaal bestaan.
Get-Command | Out-Printer
Maar even serieus, het idee is dat je als beginner snel vertrouwt raakt met de opbouw van de cmdlets en truukjes als Get-Command. Je merkt dan al snel dat je geen behoefte meer hebt aan een boek.
Iets anders is dat er niet zoiets bestaat als 'alle cmdlets'. Zo zijn er cmdlets die bij het OS horen, cmdlets die alleen verschijnen als je bepaalde features installeert, cmdlets uit een remote PowerShell sessie naar een server, custom modules die bij een applicatie horen of op een bepaald moment zelfs cmdlets die je zelf gemaakt hebt.
[ Voor 62% gewijzigd door Jazzy op 05-04-2020 22:31 ]
Beste medetweakers,
Wellicht dat iemand van jullie mij kan helpen. Ik moet vanwege verschillende Vlans mijn script op een 3de pc uitvoeren. Hetgeen wat ik wil bereiken is een vast IP instellen op een VM die nog geen netwerkverbinding heeft via een script. Na wat google kwam ik er achter dat je hiervoor Powershell direct kan gebruiken op een hyper-v host. Nou kan ik dus (vanwege vlans) niet direct op de hyper-v host mijn gehele script aftrappen maar moet dit vanaf een 3de pc.
Situatie is als volgt:
Computer "A" - de pc waarvan ik het script aftrap
Computer "B" - de hyper-v machine
Computer "C" - de VM waar ik een statisch IP moet instellen
Nou dacht ik aan het volgende:
Dit command wordt afgetrapt vanaf computer "A"
Maar zoals ik al dacht is het niet mogelijk een invoke-command in een invoke-command te runnen. Maar als ik mijn commando wil testen door eerst (enter-pssession -computername "B") en vervolgens het 2de invoke-command te runnen werkt het perfect.
Hieruit haal ik dus dat alleen de 2 invoke-commands in elkaar niet werken.
Wellicht dat een van jullie een andere oplossing hiervoor heeft of kan bedenken.
Hulp wordt erg gewaardeerd.
Mvg,
Bart
Wellicht dat iemand van jullie mij kan helpen. Ik moet vanwege verschillende Vlans mijn script op een 3de pc uitvoeren. Hetgeen wat ik wil bereiken is een vast IP instellen op een VM die nog geen netwerkverbinding heeft via een script. Na wat google kwam ik er achter dat je hiervoor Powershell direct kan gebruiken op een hyper-v host. Nou kan ik dus (vanwege vlans) niet direct op de hyper-v host mijn gehele script aftrappen maar moet dit vanaf een 3de pc.
Situatie is als volgt:
Computer "A" - de pc waarvan ik het script aftrap
Computer "B" - de hyper-v machine
Computer "C" - de VM waar ik een statisch IP moet instellen
Nou dacht ik aan het volgende:
Dit command wordt afgetrapt vanaf computer "A"
code:
1
2
3
4
5
| Invoke-Command -ComputerName "B"-ScriptBlock { Invoke-Command -VMName "C" -ScriptBlock { Get-NetIPAddress | Where-Object {($_.AddressFamily -eq "IPv4" -and $_.InterfaceAlias -like "Ethernet*" )} | New-NetIPAddress -IPAddress xxx.xxx.xxx.xxx -PrefixLength xx -DefaultGateway xxx.xxx.xxx.xxx } } |
Maar zoals ik al dacht is het niet mogelijk een invoke-command in een invoke-command te runnen. Maar als ik mijn commando wil testen door eerst (enter-pssession -computername "B") en vervolgens het 2de invoke-command te runnen werkt het perfect.
Hieruit haal ik dus dat alleen de 2 invoke-commands in elkaar niet werken.
Wellicht dat een van jullie een andere oplossing hiervoor heeft of kan bedenken.
Hulp wordt erg gewaardeerd.
Mvg,
Bart
Is het remote inschieten van een scheduled task op de hyperV box, die met powershell direct een VM configureert op optie?
De scheduled task wijst naar een script op de hyperV machine, dat parameters accepteert voor de variabelen ( zoal VMnaam, IPadres, subnetmask, gateway en DNS)
De scheduled task wijst naar een script op de hyperV machine, dat parameters accepteert voor de variabelen ( zoal VMnaam, IPadres, subnetmask, gateway en DNS)
Mijn probleem is dat mijn variabelen direct worden uitgevoerd op het moment dat ik mijn script start of een script open in ISE om aan te passen. Ik heb daarom een na wat Googlen (2 uur) een $PROFILE aangemaakt waar ik de variabelen in zet in de hoop dat ze niet gelijk uitgevoerd worden maar wel bruikbaar zijn in de "Main file", helaas werkt dat niet zo.
Onderstaande regel werkt, waarschijnlijk omdat er geen functie aan zit verbonden:
De regel hieronder gaat bijvoorbeeld uitgevoerd worden (buiten dat de code waarschijnlijk fout is):
De volgende is er ook een, die gelijk bij het starten wordt uitgevoerd. Deze regel zal een beetje kloppen, Powershell vraagt om een path in te voeren of geeft een foutmelding dat het bestand niet kan worden gevonden. Ook zegt hij wel eens dat het bestand in gebruik is.
Bij het afsluiten van Powershell blijft de logging soms aan staan, handmatig krijg ik de logging soms ook niet aan. Er wordt wel een melding weergegeven dat de logging start in D:\LogFile.txt maar er verschijnt niets in dit bestand.
Wat doe ik fout?
Ik ben er vandaag pas mee begonnen, Jip en Janneke taal wordt op prijs gesteld
Onderstaande regel werkt, waarschijnlijk omdat er geen functie aan zit verbonden:
code:
1
| New-Variable -Name "LogFile" -Value "D:\LogFile.txt" |
De regel hieronder gaat bijvoorbeeld uitgevoerd worden (buiten dat de code waarschijnlijk fout is):
code:
1
| New-Variable -Name "StartLog" -Value (Start-Transcript -path D:\LogFile.txt) |
De volgende is er ook een, die gelijk bij het starten wordt uitgevoerd. Deze regel zal een beetje kloppen, Powershell vraagt om een path in te voeren of geeft een foutmelding dat het bestand niet kan worden gevonden. Ook zegt hij wel eens dat het bestand in gebruik is.
code:
1
| New-Variable -Name "ClearLog" -Value (Clear-Content) |
Bij het afsluiten van Powershell blijft de logging soms aan staan, handmatig krijg ik de logging soms ook niet aan. Er wordt wel een melding weergegeven dat de logging start in D:\LogFile.txt maar er verschijnt niets in dit bestand.
Wat doe ik fout?
Ik ben er vandaag pas mee begonnen, Jip en Janneke taal wordt op prijs gesteld
Je doet op zich wel op een rare manierKruimelTuimel schreef op maandag 31 mei 2021 @ 17:00:
Mijn probleem is dat mijn variabelen direct worden uitgevoerd op het moment dat ik mijn script start of een script open in ISE om aan te passen. Ik heb daarom een na wat Googlen (2 uur) een $PROFILE aangemaakt waar ik de variabelen in zet in de hoop dat ze niet gelijk uitgevoerd worden maar wel bruikbaar zijn in de "Main file", helaas werkt dat niet zo.
Onderstaande regel werkt, waarschijnlijk omdat er geen functie aan zit verbonden:
code:
1 New-Variable -Name "LogFile" -Value "D:\LogFile.txt"
De regel hieronder gaat bijvoorbeeld uitgevoerd worden (buiten dat de code waarschijnlijk fout is):
code:
1 New-Variable -Name "StartLog" -Value (Start-Transcript -path D:\LogFile.txt)
De volgende is er ook een, die gelijk bij het starten wordt uitgevoerd. Deze regel zal een beetje kloppen, Powershell vraagt om een path in te voeren of geeft een foutmelding dat het bestand niet kan worden gevonden. Ook zegt hij wel eens dat het bestand in gebruik is.
code:
1 New-Variable -Name "ClearLog" -Value (Clear-Content)
Bij het afsluiten van Powershell blijft de logging soms aan staan, handmatig krijg ik de logging soms ook niet aan. Er wordt wel een melding weergegeven dat de logging start in D:\LogFile.txt maar er verschijnt niets in dit bestand.
Wat doe ik fout?
Ik ben er vandaag pas mee begonnen, Jip en Janneke taal wordt op prijs gesteld
Meestal vul je een variable zo:
PowerShell:
1
| $LogFile = "D:\LogFile.txt" |
En dan
PowerShell:
1
| $Startlog = Start-Transcript -Path $logfile |
Je kan dan overal aanroepen door $Startlog te doen
[ Voor 7% gewijzigd door Turdie op 31-05-2021 17:52 ]
Dat rare is idd wel eens mijn probleemTurdie schreef op maandag 31 mei 2021 @ 17:22:
[...]
Je doet op zich wel op een rare manier
Meestal vul je een variable zo:
PowerShell:
1 $LogFile = "D:\LogFile.txt"
En dan
PowerShell:
1 $Startlog = "Start-Transcript -Path $logfile"
Dat heb ik gedaan omdat ik niet begrijp waarom het allemaal direct wordt uitgevoerd, ik heb de variabel commando's opgezocht en allemaal gebruikt, $New-variable was de laatste.
In mijn $PROFILE bestand staat nu bijvoorbeeld alleen:
PowerShell:
1
2
3
| $LogFile = "D:\LogFile.txt" $Startlog = Start-Transcript -Path $logfile $Clearlog = Clear-Content -path $logfile |
Als ik het bestand "SCRIPT.PS1" edit, start ISE op om te editen maar krijg ik deze melding:
Clear-Content : The process cannot access the file 'D:\LogFile.txt' because it is being used by another process.
Dus een variabel als
PowerShell:
voert hij gelijk uit.1
| $Startlog = Start-Transcript -Path $logfile |
Als ik enkel dit gebruik zie ik dat er een LogFile.txt wordt aangemaakt.
PowerShell:
1
2
| $LogFile = "D:\LogFile.txt" $Startlog = Start-Transcript -Path $logfile |
Ook als ik in Powershell handmatig het volgende typ:
PowerShell:
1
| $Startlog = Start-Transcript -Path $logfile |
Wordt er gelijk een bestandje aangemaakt.
[ Voor 6% gewijzigd door KruimelTuimel op 31-05-2021 18:10 ]
Dat komt waarschijnlijk omdat Start-Transcript de file lockt. Ik denk dat je naar een andere manier van loggen moet kijken. Start-Transscript wordt meestal gebruikt om het hele script te loggen en ipv van alleen errors wegschrijven, vandaar dat je tijdens de uitvoer van het script niet bij de logfile kan. Je moet eerst Stop-Transscript doen voordat je verder iets kan met de fileKruimelTuimel schreef op maandag 31 mei 2021 @ 18:02:
[...]
Dat rare is idd wel eens mijn probleem
Dat heb ik gedaan omdat ik niet begrijp waarom het allemaal direct wordt uitgevoerd, ik heb de variabel commando's opgezocht en allemaal gebruikt, $New-variable was de laatste.
In mijn $PROFILE bestand staat nu bijvoorbeeld alleen:
PowerShell:
1 2 3 $LogFile = "D:\LogFile.txt" $Startlog = Start-Transcript -Path $logfile $Clearlog = Clear-Content -path $logfile
Als ik het bestand "SCRIPT.PS1" edit, start ISE op om te editen maar krijg ik deze melding:
Clear-Content : The process cannot access the file 'D:\LogFile.txt' because it is being used by another process.
Dus een variabel alsPowerShell:voert hij gelijk uit.
1 $Startlog = Start-Transcript -Path $logfile
Als ik enkel dit gebruik zie ik dat er een LogFile.txt wordt aangemaakt.
PowerShell:
1 2 $LogFile = "D:\LogFile.txt" $Startlog = Start-Transcript -Path $logfile
Ook als ik in Powershell handmatig het volgende typ:
PowerShell:
1 $Startlog = Start-Transcript -Path $logfile
Wordt er gelijk een bestandje aangemaakt.
Makkelijker is om de dingen in je script die je wil loggen weg te schrijven met Add-Content o.i.d
[ Voor 5% gewijzigd door Turdie op 31-05-2021 18:35 ]
Ja. Want je zegt eigenlijk: Voer het commando Start-Transcript uit en ken het resultaat aan de variabele StartLog toe.KruimelTuimel schreef op maandag 31 mei 2021 @ 18:02:
[...]
Dus een variabel alsPowerShell:voert hij gelijk uit.
1 $Startlog = Start-Transcript -Path $logfile
Dat is natuurlijk wat ik fout doe!!!downtime schreef op maandag 31 mei 2021 @ 18:32:
[...]
Ja. Want je zegt eigenlijk: Voer het commando Start-Transcript uit en ken het resultaat aan de variabele StartLog toe.
Hahaha. Af en toe hé, pak alsjeblieft mijn toetsenbord af
Start-transcript is natuurlijk een eenmalig commando wat vervolgens blijft loggen totdat je het zelf een halt toe roept.
Dit werkt natuurlijk wel:
PowerShell:
1
| $Startlog = (Start-Transcript -Path $logfile) |
@Turdie
Ik zal er eens naar kijken, het liefst schrijf ik iedere X aantal minuten een log in plaats van het actief te loggen.
[ Voor 19% gewijzigd door KruimelTuimel op 31-05-2021 19:02 ]
Klopt. Daarom heb je ook Stop-Transcript.KruimelTuimel schreef op maandag 31 mei 2021 @ 18:51:
[...]
Start-transcript is natuurlijk een eenmalig commando wat vervolgens blijft loggen totdat je het zelf een halt toe roept.
De "verbs" (werkwoorden) in de PS commando's hebben een betekenis. Normaal gesproken wordt de Start-verb gebruikt om een proces te starten en dan verder te gaan met de uitvoering van het script, zonder te wachten tot het gestartte proces klaar is. In veel gevallen is er dan een apart commando om dat proces later te stoppen.
https://docs.microsoft.co...mands?view=powershell-7.1
Nee. Dat doet (in dit geval) exact hetzelfde als zonder de haakjes.Dit werkt natuurlijk wel:
PowerShell:
1 $Startlog = (Start-Transcript -Path $logfile)
Ik ben vergeten mijn oude code erbij te kopieren die wat omslachtiger was.downtime schreef op maandag 31 mei 2021 @ 19:48:
[...]
Klopt. Daarom heb je ook Stop-Transcript.
De "verbs" (werkwoorden) in de PS commando's hebben een betekenis. Normaal gesproken wordt de Start-verb gebruikt om een proces te starten en dan verder te gaan met de uitvoering van het script, zonder te wachten tot het gestartte proces klaar is. In veel gevallen is er dan een apart commando om dat proces later te stoppen.
https://docs.microsoft.co...mands?view=powershell-7.1
[...]
Nee. Dat doet (in dit geval) exact hetzelfde als zonder de haakjes.
PowerShell:
1
| New-Variable -Name "StartLog" -Value (Start-Transcript -path D:\LogFile.txt) |
Ik heb voornamelijk het probleem dat ik me ergens mee bezig houd en geen pauze neem waardoor het aan het einde van de dag pure chaos wordt, tunnelvisie staat dan op de voorgrond
Ik doe het nu via een aantal scripts. Eerst een check-script, deze start een nieuw proces waar hij meteen gaat loggen en het geen problemen veroorzaakt. Aan het einde natuurlijk stop-transcript.
Oplossen kan ook zo
PowerShell:
1
2
3
4
5
| $LogFile = "D:\Testtest.txt" $StartLog = start-transcript $LogFile $StopLog = stop-transcript $ClearLog = clear-content $LogFile $RemoveLog = Remove-Item $LogFile |
Ik weet niet helemaal 100% wat je wilt bereiken, maar een aantal dingen die me opvallen.KruimelTuimel schreef op dinsdag 1 juni 2021 @ 10:01:
[...]
Ik ben vergeten mijn oude code erbij te kopieren die wat omslachtiger was.
PowerShell:
1 New-Variable -Name "StartLog" -Value (Start-Transcript -path D:\LogFile.txt)
Ik heb voornamelijk het probleem dat ik me ergens mee bezig houd en geen pauze neem waardoor het aan het einde van de dag pure chaos wordt, tunnelvisie staat dan op de voorgrond![]()
Ik doe het nu via een aantal scripts. Eerst een check-script, deze start een nieuw proces waar hij meteen gaat loggen en het geen problemen veroorzaakt. Aan het einde natuurlijk stop-transcript.
Oplossen kan ook zo![]()
PowerShell:
1 2 3 4 5 $LogFile = "D:\Testtest.txt" $StartLog = start-transcript $LogFile $StopLog = stop-transcript $ClearLog = clear-content $LogFile $RemoveLog = Remove-Item $LogFile
Je stopt alle functies in variabelen, worden die later ook nog gebruikt?
Zo nee, stop ze dan niet in variabelen. Ze worden namelijk direct uitgevoerd zoals je al gemerkt hebt.
Als je start-transcript meerdere malen in en uit wilt schakelen, gebruik dan de flag -append. Hiermee wordt het bestand niet steeds geleegd en opnieuw geschreven, maar wordt er aan toegevoegd.
Ik zou dan wel een time/date stamp in de naam stoppen, zodat je daar ook nog op kunt filteren en eventueel kunt opruimen na X tijd.
Zelf maak ik eigenlijk altijd een functie waarmee ik logs schrijf, hierin maak ik dan verschillende flags zoals bijv. error level en debug. Hiermee bepaal ik dan zelf of iets wordt geschreven naar een bestand of dat het alleen op het scherm wordt weergegeven in een bepaalde kleur. Afhankelijk of het een background script is of niet.
Start-transcript is imho alleen handig voor debuggen, maar ik zou het niet gebruiken voor standaard gebruik.
Je kunt via Try Catch Finally hele mooie dingen doen en fouten opvangen en loggen.
Nou ken ik je situatie natuurlijk niet, maar is het niet mogelijk om DHCP te gebruiken voor een tijdelijk adres en via dat adres te verbinden en een statisch adres te geven?bart1604 schreef op woensdag 13 januari 2021 @ 23:11:
Beste medetweakers,
Wellicht dat iemand van jullie mij kan helpen. Ik moet vanwege verschillende Vlans mijn script op een 3de pc uitvoeren. Hetgeen wat ik wil bereiken is een vast IP instellen op een VM die nog geen netwerkverbinding heeft via een script. Na wat google kwam ik er achter dat je hiervoor Powershell direct kan gebruiken op een hyper-v host. Nou kan ik dus (vanwege vlans) niet direct op de hyper-v host mijn gehele script aftrappen maar moet dit vanaf een 3de pc.
Situatie is als volgt:
Computer "A" - de pc waarvan ik het script aftrap
Computer "B" - de hyper-v machine
Computer "C" - de VM waar ik een statisch IP moet instellen
Nou dacht ik aan het volgende:
Dit command wordt afgetrapt vanaf computer "A"
code:
1 2 3 4 5 Invoke-Command -ComputerName "B"-ScriptBlock { Invoke-Command -VMName "C" -ScriptBlock { Get-NetIPAddress | Where-Object {($_.AddressFamily -eq "IPv4" -and $_.InterfaceAlias -like "Ethernet*" )} | New-NetIPAddress -IPAddress xxx.xxx.xxx.xxx -PrefixLength xx -DefaultGateway xxx.xxx.xxx.xxx } }
Maar zoals ik al dacht is het niet mogelijk een invoke-command in een invoke-command te runnen. Maar als ik mijn commando wil testen door eerst (enter-pssession -computername "B") en vervolgens het 2de invoke-command te runnen werkt het perfect.
Hieruit haal ik dus dat alleen de 2 invoke-commands in elkaar niet werken.
Wellicht dat een van jullie een andere oplossing hiervoor heeft of kan bedenken.
Hulp wordt erg gewaardeerd.
Mvg,
Bart
Een golden image/referentie VHDX waarmee je de VM's installeert die een opstart script heeft die het ip-adres instelt?bart1604 schreef op woensdag 13 januari 2021 @ 23:11:
Beste medetweakers,
Wellicht dat iemand van jullie mij kan helpen. Ik moet vanwege verschillende Vlans mijn script op een 3de pc uitvoeren. Hetgeen wat ik wil bereiken is een vast IP instellen op een VM die nog geen netwerkverbinding heeft via een script. Na wat google kwam ik er achter dat je hiervoor Powershell direct kan gebruiken op een hyper-v host. Nou kan ik dus (vanwege vlans) niet direct op de hyper-v host mijn gehele script aftrappen maar moet dit vanaf een 3de pc.
Situatie is als volgt:
Computer "A" - de pc waarvan ik het script aftrap
Computer "B" - de hyper-v machine
Computer "C" - de VM waar ik een statisch IP moet instellen
Nou dacht ik aan het volgende:
Dit command wordt afgetrapt vanaf computer "A"
code:
1 2 3 4 5 Invoke-Command -ComputerName "B"-ScriptBlock { Invoke-Command -VMName "C" -ScriptBlock { Get-NetIPAddress | Where-Object {($_.AddressFamily -eq "IPv4" -and $_.InterfaceAlias -like "Ethernet*" )} | New-NetIPAddress -IPAddress xxx.xxx.xxx.xxx -PrefixLength xx -DefaultGateway xxx.xxx.xxx.xxx } }
Maar zoals ik al dacht is het niet mogelijk een invoke-command in een invoke-command te runnen. Maar als ik mijn commando wil testen door eerst (enter-pssession -computername "B") en vervolgens het 2de invoke-command te runnen werkt het perfect.
Hieruit haal ik dus dat alleen de 2 invoke-commands in elkaar niet werken.
Wellicht dat een van jullie een andere oplossing hiervoor heeft of kan bedenken.
Hulp wordt erg gewaardeerd.
Mvg,
Bart
Of anders DHCP
Ik ga mijn best doen om het uit te leggen.DeMolT. schreef op dinsdag 1 juni 2021 @ 10:21:
[...]
Ik weet niet helemaal 100% wat je wilt bereiken, maar een aantal dingen die me opvallen.
Je stopt alle functies in variabelen, worden die later ook nog gebruikt?
Zo nee, stop ze dan niet in variabelen. Ze worden namelijk direct uitgevoerd zoals je al gemerkt hebt.
Als je start-transcript meerdere malen in en uit wilt schakelen, gebruik dan de flag -append. Hiermee wordt het bestand niet steeds geleegd en opnieuw geschreven, maar wordt er aan toegevoegd.
Ik zou dan wel een time/date stamp in de naam stoppen, zodat je daar ook nog op kunt filteren en eventueel kunt opruimen na X tijd.
Zelf maak ik eigenlijk altijd een functie waarmee ik logs schrijf, hierin maak ik dan verschillende flags zoals bijv. error level en debug. Hiermee bepaal ik dan zelf of iets wordt geschreven naar een bestand of dat het alleen op het scherm wordt weergegeven in een bepaalde kleur. Afhankelijk of het een background script is of niet.
Start-transcript is imho alleen handig voor debuggen, maar ik zou het niet gebruiken voor standaard gebruik.
Je kunt via Try Catch Finally hele mooie dingen doen en fouten opvangen en loggen.
Het is puur voor de hobby dus een beetje aanpappen vind ik niet erg
Ik maak gebruik van het crypto-netwerk CHIA en doe daarbij "plotten". In de applicatie zelf kun je enkel een tijdsbestek instellen tussen wanneer je volgende "plot" begint, dat is een vaste waarde.
Het is het efficienste om een nieuwe plot te starten als een bepaalde fase van een al lopende plot is aangebroken, er zit echter ook een maximum aan afhankelijk van wat je systeem aan kan.
Als je gebruik maakt van je PC en je bent ondertussen aan het plotten, kan het best zo zijn dat je vooraf ingestelde tijd veels te kort is, waardoor er meer plots gaan starten dan dat je eigenlijk wilt. Dit wordt een opeenstapeling waardoor je uiteindelijk zo veel plots hebt lopen dat ze "kapot" gaan of dat je systeem niet meer te gebruiken is.
Afhankelijk van het gebruik van de PC kan het ook zo zijn dat je tijd veel te lang is en je heel ineffcient aan het plotten bent.
Anyway, dit programma kun je ook via PowerShell starten.
Mijn idee was om via task manager een check in te plannen die iedere 5 minuten kijkt hoeveel plots er bezig zijn en in welke fase van plotten zij zich bevinden.
Aan de hand daarvan wil ik automatisch een nieuw powershell venster laten openen (op de achtergrond) en de commands doorgeven om de plot te starten.
Als ik iedere plot in een apart venster open en hier een "uniek nummer" aan toewijs kan ik de plots in ieder geval apart van elkaar groeperen.
Verder heb ik nog niet na gedacht
Dus bij ieder nieuw venster zou ik een nieuw transcript starten en dit opslaan onder een eigen nummer. Oplopend van 1.
Wellicht dat je een functie kunt maken, die gooi je in een loopje waarin je jobs start (start-job) en vervolgens laat je die jobs draaien zolang je wilt.KruimelTuimel schreef op woensdag 2 juni 2021 @ 15:17:
[...]
Ik ga mijn best doen om het uit te leggen.
Het is puur voor de hobby dus een beetje aanpappen vind ik niet erg![]()
Ik maak gebruik van het crypto-netwerk CHIA en doe daarbij "plotten". In de applicatie zelf kun je enkel een tijdsbestek instellen tussen wanneer je volgende "plot" begint, dat is een vaste waarde.
Het is het efficienste om een nieuwe plot te starten als een bepaalde fase van een al lopende plot is aangebroken, er zit echter ook een maximum aan afhankelijk van wat je systeem aan kan.
Als je gebruik maakt van je PC en je bent ondertussen aan het plotten, kan het best zo zijn dat je vooraf ingestelde tijd veels te kort is, waardoor er meer plots gaan starten dan dat je eigenlijk wilt. Dit wordt een opeenstapeling waardoor je uiteindelijk zo veel plots hebt lopen dat ze "kapot" gaan of dat je systeem niet meer te gebruiken is.
Afhankelijk van het gebruik van de PC kan het ook zo zijn dat je tijd veel te lang is en je heel ineffcient aan het plotten bent.
Anyway, dit programma kun je ook via PowerShell starten.
Mijn idee was om via task manager een check in te plannen die iedere 5 minuten kijkt hoeveel plots er bezig zijn en in welke fase van plotten zij zich bevinden.
Aan de hand daarvan wil ik automatisch een nieuw powershell venster laten openen (op de achtergrond) en de commands doorgeven om de plot te starten.
Als ik iedere plot in een apart venster open en hier een "uniek nummer" aan toewijs kan ik de plots in ieder geval apart van elkaar groeperen.
Verder heb ik nog niet na gedacht![]()
Dus bij ieder nieuw venster zou ik een nieuw transcript starten en dit opslaan onder een eigen nummer. Oplopend van 1.
Aan het einde van het script maak je daarvoor een do until loopje, daarmee kun je dan een tijd instellen of een andere waarde waarna je de jobs killed.