Ik denk niet als je een commando via invoke-command uitvoert dat dan meteen alle 10 computers de output naar een file te schrijven.Hij gaat namelijk computer per computer af en gaat naar de volgende.mswp schreef op maandag 25 maart 2019 @ 15:42:
[...]
Ik wil de computernaam ophalen om weg te schrijven in een logfile. Ik heb het nu draaien via invoke-command. Hiermee draait hij dus het scriptje op de betreffende computer. Ik ga morgen testen hoe dit gaat om met 10 computers tegelijk in 1 file te schrijven, ik ben ook wel benieuwd hoe dit gaat met 80 tegelijk. Iemand ervaring mee?
Alles wat ik nieuw ga maken wil ik zonder de tool gaan maken, hoe mooi is het om zometeen niet meer tool afhankelijk te zijn? M'n baas betaald er nu voor en volgens mij moet het ook 'gratis' met PowerShell kunnen?
http://www.happysysadm.co...dule-with-powershell.html
Hoe gratis is het als jij er tijd in moet steken? Dat pakt vaak veel duurder uit dan wanneer je er een kant-en-klare tool voor kunt kopen.mswp schreef op maandag 25 maart 2019 @ 15:42:
[...]
Alles wat ik nieuw ga maken wil ik zonder de tool gaan maken, hoe mooi is het om zometeen niet meer tool afhankelijk te zijn? M'n baas betaald er nu voor en volgens mij moet het ook 'gratis' met PowerShell kunnen?
Je kunt het gelijktijdig doen, met jobs, maar heel gemakkelijk is het niet. Gezien het niveau van de vragen die @mwsp stelde denk ik dat jobs voor hem wat te hoog gegrepen zijn.shadowman12 schreef op maandag 25 maart 2019 @ 18:41:
[...]
Ik denk niet als je een commando via invoke-command uitvoert dat dan meteen alle 10 computers de output naar een file te schrijven.Hij gaat namelijk computer per computer af en gaat naar de volgende.
https://www.howtogeek.com...o-use-jobs-in-powershell/
Zou ik niet doen, krijg je misschien file locking issuesdowntime schreef op maandag 25 maart 2019 @ 18:58:
[...]
Je kunt het gelijktijdig doen, met jobs, maar heel gemakkelijk is het niet. Gezien het niveau van de vragen die @mwsp stelde denk ik dat jobs voor hem wat te hoog gegrepen zijn.
https://www.howtogeek.com...o-use-jobs-in-powershell/
[ Voor 11% gewijzigd door Turdie op 25-03-2019 19:17 ]
Wel leerzaam. Als de baas liever tijd dan geld besteed, dan heb je voor jezelf mooi de kans om je kennis te vergroten. Altijd weer bruikbaar voor een volgend project of andere werkplek.downtime schreef op maandag 25 maart 2019 @ 18:51:
[...]
Hoe gratis is het als jij er tijd in moet steken? Dat pakt vaak veel duurder uit dan wanneer je er een kant-en-klare tool voor kunt kopen.
@shadowman12 @punisher007 @downtime Ik zal er morgen eens mee gaan spelen. Als invoke-command elke pc 1 voor 1 langsloopt ben ik er al natuurlijk.
Kan je met jobs de commando's wel laten uitvoeren zodra een host online is/komt? Stel ik maak een taak zoals: check online > run command > if not online run tomorrow of zo iets. Nu moet ik nog een aantal keer handmatig het invoke-command uitvoeren.
😲
Nee zo werken jobs niet, lees je even in, staat genoeg over beschreven op docs.microsoft.commswp schreef op maandag 25 maart 2019 @ 20:14:
@downtime @pjlgt Het is inderdaad leergeld. Mn baas betaald mij liever 40 uur dan dat er een tool gekocht moet worden.
@shadowman12 @punisher007 @downtime Ik zal er morgen eens mee gaan spelen. Als invoke-command elke pc 1 voor 1 langsloopt ben ik er al natuurlijk.
Kan je met jobs de commando's wel laten uitvoeren zodra een host online is/komt? Stel ik maak een taak zoals: check online > run command > if not online run tomorrow of zo iets. Nu moet ik nog een aantal keer handmatig het invoke-command uitvoeren.
Je zou het misschien wel op een bepaalde tijd kunnen schedulen.
[ Voor 11% gewijzigd door Turdie op 25-03-2019 21:59 ]
Het script is gemaakt om bestanden te kopieren van een server naar een locale map op een PC die het scipt runt, maar staat op verschillende MDT servers.
het ziet er zo uit:
Copy-Item "\\<Servername>\DeploymentShare\Resources\<Applicatie>" -Destination "C:\Users\Default\AppData\Roaming" -Recurse
Ik maak alleen wijzigingen op de 'main mdt' server en deze kopieer naar andere MDT servers (via robocopy scripts) wil ik dat de <servername> automagisch verwijst naar de MDT server waar de Task Sequence van MDT draait.
Nu ben ik na het kopieren van wijzigingen bezig het script aan te passen op verschillende MDT servers. Niet bepaald effectief.
Door het robocopy script wordt mijn powershell script steeds overschreven omdat deze na mijn wijziging naar de betreffende MDT server gezien wordt als afwijkend. (ik synchroniseer alleen wijzigingen om bandbreedte te besparen)
het script zou dus op de plek voor <servername> naar bijv. \\NLD-MDT moeten verwijzen voor de Nederlands MDT server en voor een UK server naar \\UK-MDT.
De scripts draaien vanaf een PC die geimaged wordt, dus verwijzen naar \\localhost gaat in dit geval niet helpen.
Is dit te doen?
Haal NOOIT een spookrijder in !
1
| Copy-Item "\\$env:computername\DeploymentShare\Resources\<Applicatie>" -Destination "C:\Users\Default\AppData\Roaming" -Recurse |
Maar dan moet de task sequence ook echt op de MDT server draaien. Wat ik nu eerlijk gezegd betwijfel. Ik neem aan dat die task sequence op een te imagen andere computer draait. Kun je daar niet ergens de MDT server uitlezen?
Misschien is dat laatste wat je zegt idd een idee
Haal NOOIT een spookrijder in !
Heb je combinatie SCCM en MDT of alleen MDT? Welke versie van MDT gebruik je?ZtaaB schreef op vrijdag 29 maart 2019 @ 13:09:
Ik heb een heel simple Powershell scriptje, waar ik eigenlijk iets ingewikkelds mee wil doen
Het script is gemaakt om bestanden te kopieren van een server naar een locale map op een PC die het scipt runt, maar staat op verschillende MDT servers.
het ziet er zo uit:
Copy-Item "\\<Servername>\DeploymentShare\Resources\<Applicatie>" -Destination "C:\Users\Default\AppData\Roaming" -Recurse
Ik maak alleen wijzigingen op de 'main mdt' server en deze kopieer naar andere MDT servers (via robocopy scripts) wil ik dat de <servername> automagisch verwijst naar de MDT server waar de Task Sequence van MDT draait.
Nu ben ik na het kopieren van wijzigingen bezig het script aan te passen op verschillende MDT servers. Niet bepaald effectief.
Door het robocopy script wordt mijn powershell script steeds overschreven omdat deze na mijn wijziging naar de betreffende MDT server gezien wordt als afwijkend. (ik synchroniseer alleen wijzigingen om bandbreedte te besparen)
het script zou dus op de plek voor <servername> naar bijv. \\NLD-MDT moeten verwijzen voor de Nederlands MDT server en voor een UK server naar \\UK-MDT.
De scripts draaien vanaf een PC die geimaged wordt, dus verwijzen naar \\localhost gaat in dit geval niet helpen.
Is dit te doen?
Dit is misschien ook een optie:
https://blog.ctglobalserv...ip/making-file-copy-easy/
[ Voor 17% gewijzigd door Turdie op 29-03-2019 19:10 ]
Waarom ga je het niet in een database wegschrijven. Zie onderstaand script als voorbeeld wat gebruikt wordt om events uit te lezen en te vergelijken. Dit schrijft weg naar een lokale database (was een test draait nu op een productie database). Je kunt het naar je eigen aanpassen en dan de waardes wegschrijven in een database (dit geval sql) en hierna kan je met powerpifot leuke dingen ermee doen.mswp schreef op maandag 25 maart 2019 @ 20:14:
@downtime @pjlgt Het is inderdaad leergeld. Mn baas betaald mij liever 40 uur dan dat er een tool gekocht moet worden.
@shadowman12 @punisher007 @downtime Ik zal er morgen eens mee gaan spelen. Als invoke-command elke pc 1 voor 1 langsloopt ben ik er al natuurlijk.
Kan je met jobs de commando's wel laten uitvoeren zodra een host online is/komt? Stel ik maak een taak zoals: check online > run command > if not online run tomorrow of zo iets. Nu moet ik nog een aantal keer handmatig het invoke-command uitvoeren.
################################################
$tijd = Get-Date
$Reg = Get-ItemProperty -path "HKCU:\Volatile Environment"
$hostename = (Get-WmiObject -Class Win32_ComputerSystem -Property Name).Name
$a = (get-eventlog Application | Where-Object { $_.EventID -eq "2" })[0].timegenerated
$b = (get-eventlog Application | Where-Object { $_.EventID -eq "6003" })[0].timegenerated
$c = $a - $b
$Startup = (get-eventlog System | Where-Object { $_.EventID -eq "12" })[0].timegenerated
$conn = New-Object System.Data.SqlClient.SqlConnection
$conn.ConnectionString = "Data Source=computernaam\POSHTEST;Initial Catalog=POSH;Persist Security Info=False;User ID=sa;Password=password;"
$conn.open()
$cmd = New-Object System.Data.SqlClient.SqlCommand
$cmd.connection = $conn
$cmd.commandtext = "INSERT INTO TABEL1 (Seconden,username,ViewClient_Machine_name,Jaar,Maand,Dag,Uur,Minute,EventID2,StartupTijd,LogonServer,ViewClient_Broker_DNS_Name,ViewClient_Client_Version,ViewClient_Launch_ID,HostName) VALUES ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','{11}','{12}','{13}','{14}');" -f $c.seconds, $Reg.Username, $reg.ViewClient_Machine_Name, $tijd.Year, $tijd.Month, $tijd.day, $tijd.hour, $tijd.minute, $a, $startup, $reg.logonserver, $reg.ViewClient_Broker_DNS_Name, $Reg.ViewClient_Client_Version, $Reg.ViewClient_Launch_ID, $hostename
$cmd.executenonquery()
$conn.close()
###################################################
Dat is inderdaad uiteindelijk wel het leukste! Ik heb er nu alleen nog 0,0 verstand van dus daar zal ik mij dan even goed in moeten verdiepen. Ga ik zeker een keer doen!mutsje schreef op maandag 1 april 2019 @ 16:46:
[...]
Waarom ga je het niet in een database wegschrijven. Zie onderstaand script als voorbeeld wat gebruikt wordt om events uit te lezen en te vergelijken. Dit schrijft weg naar een lokale database (was een test draait nu op een productie database). Je kunt het naar je eigen aanpassen en dan de waardes wegschrijven in een database (dit geval sql) en hierna kan je met powerpifot leuke dingen ermee doen.
################################################
$tijd = Get-Date
$Reg = Get-ItemProperty -path "HKCU:\Volatile Environment"
$hostename = (Get-WmiObject -Class Win32_ComputerSystem -Property Name).Name
$a = (get-eventlog Application | Where-Object { $_.EventID -eq "2" })[0].timegenerated
$b = (get-eventlog Application | Where-Object { $_.EventID -eq "6003" })[0].timegenerated
$c = $a - $b
$Startup = (get-eventlog System | Where-Object { $_.EventID -eq "12" })[0].timegenerated
$conn = New-Object System.Data.SqlClient.SqlConnection
$conn.ConnectionString = "Data Source=computernaam\POSHTEST;Initial Catalog=POSH;Persist Security Info=False;User ID=sa;Password=password;"
$conn.open()
$cmd = New-Object System.Data.SqlClient.SqlCommand
$cmd.connection = $conn
$cmd.commandtext = "INSERT INTO TABEL1 (Seconden,username,ViewClient_Machine_name,Jaar,Maand,Dag,Uur,Minute,EventID2,StartupTijd,LogonServer,ViewClient_Broker_DNS_Name,ViewClient_Client_Version,ViewClient_Launch_ID,HostName) VALUES ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','{11}','{12}','{13}','{14}');" -f $c.seconds, $Reg.Username, $reg.ViewClient_Machine_Name, $tijd.Year, $tijd.Month, $tijd.day, $tijd.hour, $tijd.minute, $a, $startup, $reg.logonserver, $reg.ViewClient_Broker_DNS_Name, $Reg.ViewClient_Client_Version, $Reg.ViewClient_Launch_ID, $hostename
$cmd.executenonquery()
$conn.close()
###################################################
Ik heb het invoke-command nog niet gestest

😲
Volgende uitdaging, UNC path met Psremoting/invoke-command.. Access Denied..mswp schreef op maandag 25 maart 2019 @ 20:14:
@shadowman12 @punisher007 @downtime Ik zal er morgen eens mee gaan spelen. Als invoke-command elke pc 1 voor 1 langsloopt ben ik er al natuurlijk.
Nu maar even inlezen over Next hop en CredSSP. Volgens mij zit ik dan in de goede richting.
😲
Je kunt gewoon credentials meegeven met Invoke-Commandmswp schreef op dinsdag 2 april 2019 @ 15:46:
[...]
Volgende uitdaging, UNC path met Psremoting/invoke-command.. Access Denied..
Nu maar even inlezen over Next hop en CredSSP. Volgens mij zit ik dan in de goede richting.
Next hop zou ik zoeken als “Double Hop”. PSRemote geeft geen credentials door. Dus je connect vanaf client1 naar server1. Als je dan iets wilt uitvoeren op server2 vanaf server1 worden geen credentials mee gegeven. Wat je dan zou kunnen doen is een nieuwe sessie creëren op server1 en die dan gebruiken voor server2. Let wel op dat dit in het geheugen staat. Dus de credentials zijn dan uit te lezen.


Ik heb bovenstaand verhaal maar weer eens opgepakt, er tot nu toe elke keer niet genoeg tijd voor gehad om er lekker mee bezig te zijn.
Ik heb het script even in een andere context opgezet maar uiteindelijk gebeurt er nagenoeg het zelf. Het resultaat moet in een logfile weggeschreven worden.
Het gaat fout bij het aanmaken of wegschrijven van de mappen/log files. Hij geeft hier onderstaande error op. Voor mijn idee zit het hem in de Variabelen maar ik krijg het niet lekker voor elkaar, weet iemand de juiste richting? Ik heb al gekeken wat er gebeurd als ik maar 1 variable gebruik, dan kan er niks mis gaan met mismatching of zo iets maar dan krijg ik een zelfde soort error terug.
Script:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| Function TEST { Param ( [string]$dir= "\\server1\files$\$computer", [string]$computer= "$env:COMPUTERNAME" ) Invoke-Command -ComputerName $computer -ScriptBlock { if(!(test-path -Path $dir)) { New-Item -ItemType Directory -Path $dir } Repair-Volume -DriveLetter C -OfflineScanAndFix >> "\\Server1\Files$\$computer\Fil1_$computer.log" } -ArgumentList $dir, $computer } |
Foutmelding:
1
2
3
4
5
6
7
8
9
10
| Toegang geweigerd + CategoryInfo : PermissionDenied: (\\server1\files$\:String) [Test-Path], UnauthorizedAccessException + FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.TestPathCommand + PSComputerName : pc1 Cannot bind argument to parameter 'Path' because it is null. + CategoryInfo : InvalidData: (:) [New-Item], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.NewItemComm and + PSComputerName : pc1 |
Een Item aanmaken lukt overigens wel gewoon in de directory vanuit de zelfde shell. Lijkt mij dus ook geen rechten dingetje.
1
2
3
4
5
6
7
8
9
10
11
12
| PS C:\WINDOWS\system32> new-item "\\server1\files$\pc1\test.txt" Directory: \\server1\files$\pc1 Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 13-5-2019 16:37 0 test.txt PS C:\WINDOWS\system32> |
[ Voor 15% gewijzigd door mswp op 13-05-2019 16:40 ]
😲
Verder definieer je de $computer variable pas na de $dir variabele terwijl je in $dir al de $computer variabele gebruikt. Dit zul je dus moeten omdraaien qua volgorde:
[string]$computer= "$env:COMPUTERNAME"
[string]$dir= "\\server1\files$\$computer",
Ik heb geen tijd om er verder in detail heen te kijken, maar dit zou al veel kunnen verklaren
1
2
3
4
5
6
7
8
9
10
11
| Function TEST { Param ( [string]$dir= "\\server1\files$\$computer", [string]$computer= "$env:COMPUTERNAME" ) $dir } Test |
PS: Het kan wel een rechten ding zijn, want wellicht heb je op \\server1\files$\ onvoldoende rechten, maar heb je op een submap wel voldoende rechten.
[ Voor 29% gewijzigd door punisher007 op 13-05-2019 17:11 ]
Probeer:mswp schreef op maandag 13 mei 2019 @ 16:22:
![]()
![]()
Ik heb bovenstaand verhaal maar weer eens opgepakt, er tot nu toe elke keer niet genoeg tijd voor gehad om er lekker mee bezig te zijn.
Ik heb het script even in een andere context opgezet maar uiteindelijk gebeurt er nagenoeg het zelf. Het resultaat moet in een logfile weggeschreven worden.
Het gaat fout bij het aanmaken of wegschrijven van de mappen/log files. Hij geeft hier onderstaande error op. Voor mijn idee zit het hem in de Variabelen maar ik krijg het niet lekker voor elkaar, weet iemand de juiste richting? Ik heb al gekeken wat er gebeurd als ik maar 1 variable gebruik, dan kan er niks mis gaan met mismatching of zo iets maar dan krijg ik een zelfde soort error terug.
Script:code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Function TEST { Param ( [string]$dir= "\\server1\files$\$computer", [string]$computer= "$env:COMPUTERNAME" ) Invoke-Command -ComputerName $computer -ScriptBlock { if(!(test-path -Path $dir)) { New-Item -ItemType Directory -Path $dir } Repair-Volume -DriveLetter C -OfflineScanAndFix >> "\\Server1\Files$\$computer\Fil1_$computer.log" } -ArgumentList $dir, $computer }
Foutmelding:code:
1 2 3 4 5 6 7 8 9 10 Toegang geweigerd + CategoryInfo : PermissionDenied: (\\server1\files$\:String) [Test-Path], UnauthorizedAccessException + FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.TestPathCommand + PSComputerName : pc1 Cannot bind argument to parameter 'Path' because it is null. + CategoryInfo : InvalidData: (:) [New-Item], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.NewItemComm and + PSComputerName : pc1
Een Item aanmaken lukt overigens wel gewoon in de directory vanuit de zelfde shell. Lijkt mij dus ook geen rechten dingetje.
code:
1 2 3 4 5 6 7 8 9 10 11 12 PS C:\WINDOWS\system32> new-item "\\server1\files$\pc1\test.txt" Directory: \\server1\files$\pc1 Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 13-5-2019 16:37 0 test.txt PS C:\WINDOWS\system32>
- de script zonder invoke te runnen op de PC als dezelfde user
- haal je code uit de functie en probeer opnieuw
- run ISE als admin en probeer
- check pssession https://stackoverflow.com...ed-error-not-a-double-hop
- BSc TI + CCNA R&S (Expired ofcourse) + CCNA SEC (Also expired ofc)-
Je mag hopen dat je geen it audit krijgt: plaintext password (terwijl je ook integrated security + logged credential kunt gebruiken) + geen prepped statements -> is 2006 back again? SQL injections waren toch verleden tijd?mutsje schreef op maandag 1 april 2019 @ 16:46:
[...]
Waarom ga je het niet in een database wegschrijven. Zie onderstaand script als voorbeeld wat gebruikt wordt om events uit te lezen en te vergelijken. Dit schrijft weg naar een lokale database (was een test draait nu op een productie database). Je kunt het naar je eigen aanpassen en dan de waardes wegschrijven in een database (dit geval sql) en hierna kan je met powerpifot leuke dingen ermee doen.
################################################
$tijd = Get-Date
$Reg = Get-ItemProperty -path "HKCU:\Volatile Environment"
$hostename = (Get-WmiObject -Class Win32_ComputerSystem -Property Name).Name
$a = (get-eventlog Application | Where-Object { $_.EventID -eq "2" })[0].timegenerated
$b = (get-eventlog Application | Where-Object { $_.EventID -eq "6003" })[0].timegenerated
$c = $a - $b
$Startup = (get-eventlog System | Where-Object { $_.EventID -eq "12" })[0].timegenerated
$conn = New-Object System.Data.SqlClient.SqlConnection
$conn.ConnectionString = "Data Source=computernaam\POSHTEST;Initial Catalog=POSH;Persist Security Info=False;User ID=sa;Password=password;"
$conn.open()
$cmd = New-Object System.Data.SqlClient.SqlCommand
$cmd.connection = $conn
$cmd.commandtext = "INSERT INTO TABEL1 (Seconden,username,ViewClient_Machine_name,Jaar,Maand,Dag,Uur,Minute,EventID2,StartupTijd,LogonServer,ViewClient_Broker_DNS_Name,ViewClient_Client_Version,ViewClient_Launch_ID,HostName) VALUES ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','{11}','{12}','{13}','{14}');" -f $c.seconds, $Reg.Username, $reg.ViewClient_Machine_Name, $tijd.Year, $tijd.Month, $tijd.day, $tijd.hour, $tijd.minute, $a, $startup, $reg.logonserver, $reg.ViewClient_Broker_DNS_Name, $Reg.ViewClient_Client_Version, $Reg.ViewClient_Launch_ID, $hostename
$cmd.executenonquery()
$conn.close()
###################################################
Misschien overdrijf ik maar zaken als deze kunnen voor de klant genoeg zijn om te switchen naar een ander IT bedrijf (zoals die van ons ;p )
- BSc TI + CCNA R&S (Expired ofcourse) + CCNA SEC (Also expired ofc)-
@punisher007 @XelefimXelefim schreef op maandag 13 mei 2019 @ 19:40:
[...]
Probeer:
- de script zonder invoke te runnen op de PC als dezelfde user
- haal je code uit de functie en probeer opnieuw
- run ISE als admin en probeer
- check pssession https://stackoverflow.com...ed-error-not-a-double-hop
Het lijkt erop dat het inderdaad een authenticatie/Double-hop probleem is.
- script runnen zonder invoke op de lokale pc gaat goed
- script runnen met invoke naar c:\temp gaat goed.
Ik ben mij een beetje aan het inlezen met Double-Hop en CredSSP maar ik begrijp dat dit zo zijn security beperking heeft. Maken jullie hier wel gebruik van? Ik wil natuurlijk niet zomaar van alles open zetten...
Wat ik wil bereiken is het volgende:
- Ik wil via een functie een script kunnen uitvoeren op mijn lokale of een opgegeven computer. De resultaten van deze functie wil ik wegschrijven in mijn log directory in een daaronder liggende computer map. Zo heb ik van elke computer een overzicht met de logbestanden beschikbaar.
- Ik ben bezig een module te maken voor mijn onderhoudsronden. Ik wil dus verschillende functies maken om bepaalde taken uit te voeren.
Terwijl ik dit typ vraag ik mij af waarom ik de resultaten vanaf de remote computer weg schrijf en niet vanaf de uitvoerende computer.. Ik ga weer even testen!

[ Voor 27% gewijzigd door mswp op 14-05-2019 10:22 ]
😲

Relevant stuk uit de error:
1
| PermissionDenied: (\\server1\files$\:String) |
Dit lijkt overeen te komen met wat @punisher007 al aangeeft:
Heb je daar al naar gekeken?punisher007 schreef op maandag 13 mei 2019 @ 17:05:
Verder definieer je de $computer variable pas na de $dir variabele terwijl je in $dir al de $computer variabele gebruikt. Dit zul je dus moeten omdraaien qua volgorde:
[string]$computer= "$env:COMPUTERNAME"
[string]$dir= "\\server1\files$\$computer",
Freelance (Microsoft) Cloud Consultant & Microsoft Certified Trainer
Maar als je dit artikel lees van MS dan snap ik waarom het fout gaat:
Ik probeer vanaf mijn pc via remote computer een share van de server op te halen.
Dus: A naar B en vanaf B naar C.
The "second hop problem" refers to a situation like the following:
You are logged in to ServerA.
From ServerA, you start a remote PowerShell session to connect to ServerB.
A command you run on ServerB via your PowerShell Remoting session attempts to access a resource on ServerC.
Access to the resource on ServerC is denied, because the credentials you used to create the PowerShell Remoting session are not passed from ServerB to ServerC.
😲
De Oplossing:mswp schreef op maandag 13 mei 2019 @ 16:22:
![]()
![]()
Ik heb bovenstaand verhaal maar weer eens opgepakt, er tot nu toe elke keer niet genoeg tijd voor gehad om er lekker mee bezig te zijn.
Ik heb het script even in een andere context opgezet maar uiteindelijk gebeurt er nagenoeg het zelf. Het resultaat moet in een logfile weggeschreven worden.
Het gaat fout bij het aanmaken of wegschrijven van de mappen/log files. Hij geeft hier onderstaande error op. Voor mijn idee zit het hem in de Variabelen maar ik krijg het niet lekker voor elkaar, weet iemand de juiste richting? Ik heb al gekeken wat er gebeurd als ik maar 1 variable gebruik, dan kan er niks mis gaan met mismatching of zo iets maar dan krijg ik een zelfde soort error terug.
Script:code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Function TEST { Param ( [string]$dir= "\\server1\files$\$computer", [string]$computer= "$env:COMPUTERNAME" ) Invoke-Command -ComputerName $computer -ScriptBlock { if(!(test-path -Path $dir)) { New-Item -ItemType Directory -Path $dir } Repair-Volume -DriveLetter C -OfflineScanAndFix >> "\\Server1\Files$\$computer\Fil1_$computer.log" } -ArgumentList $dir, $computer }
Foutmelding:code:
1 2 3 4 5 6 7 8 9 10 Toegang geweigerd + CategoryInfo : PermissionDenied: (\\server1\files$\:String) [Test-Path], UnauthorizedAccessException + FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.TestPathCommand + PSComputerName : pc1 Cannot bind argument to parameter 'Path' because it is null. + CategoryInfo : InvalidData: (:) [New-Item], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.NewItemComm and + PSComputerName : pc1
Een Item aanmaken lukt overigens wel gewoon in de directory vanuit de zelfde shell. Lijkt mij dus ook geen rechten dingetje.
code:
1 2 3 4 5 6 7 8 9 10 11 12 PS C:\WINDOWS\system32> new-item "\\server1\files$\pc1\test.txt" Directory: \\server1\files$\pc1 Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 13-5-2019 16:37 0 test.txt PS C:\WINDOWS\system32>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| Function TEST { Param ( [string]$computer= "$env:COMPUTERNAME" [string]$dir= "\\server1\files$\$computer", ) if(!(test-path -Path $dir)) {New-Item -ItemType Directory -Path $dir} $out= Invoke-Command -ComputerName $computer -ScriptBlock{ Repair-Volume -DriveLetter C -OfflineScanAndFix } $out | select name > $dir\test.txt } |
Bedankt voor het meedenken allemaal!
😲
Maar werkt je code nu dan?mswp schreef op dinsdag 14 mei 2019 @ 11:16:
[...]
De Oplossing:
code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Function TEST { Param ( [string]$computer= "$env:COMPUTERNAME" [string]$dir= "\\server1\files$\$computer", ) if(!(test-path -Path $dir)) {New-Item -ItemType Directory -Path $dir} $out= Invoke-Command -ComputerName $computer -ScriptBlock{ Repair-Volume -DriveLetter C -OfflineScanAndFix } $out | select name > $dir\test.txt }
Bedankt voor het meedenken allemaal!
Want [string]$dir= "\\server1\files$\$computer"
De $ achter \files$\ is nogal tricky kan mij voorstellen dat powershell daar over valt ?
Ik zou het zo schrijven.
1
| [string]$dir= '\\server1\files$\' + "$computer" |
Ja hij werkt nu op deze manier. Ik zelf viel er wel even een keer over dat ik dacht van oh, variable verkeerdom gezet.Thijs B schreef op woensdag 15 mei 2019 @ 16:51:
[...]
Maar werkt je code nu dan?
Want [string]$dir= "\\server1\files$\$computer"
De $ achter \files$\ is nogal tricky kan mij voorstellen dat powershell daar over valt ?
Ik zou het zo schrijven.
code:
1 [string]$dir= '\\server1\files$\' + "$computer"
Ik denk dat het op die manier wel veiliger is inderdaad! Ik zal het eens proberen.
😲
Laat die quotes rond $computer dan ook maar weg. Werkt wel maar het is nergens goed voor. Beter is:Thijs B schreef op woensdag 15 mei 2019 @ 16:51:
[...]
Ik zou het zo schrijven.
code:
1 [string]$dir= '\\server1\files$\' + "$computer"
1
| [string]$dir= '\\server1\files$\' + $computer |
Sowieso vind ik het gebruik van variable expansion vies. Zeker in langere strings met lappen tekst ga je die dollartekens snel over het hoofd zien.
Ik gebruik liever dit om tekst en variabelen te scheiden, voor mij is dit duidelijker, zeker als er meerdere variabelen in die tekst voorkomen:
1
| [string]$dir= '\\server1\files$\{0}' -f $computer |
Zo zie ik meteen of het gewoon platte tekst is of dat er variabelen verwerkt worden. Maakt niet veel uit in zo'n korte string maar het verschil wordt groter naarmate de tekst langer wordt.
Ben begonnen met het maken van een tooling, o.a. copy van user permissions van account 1 naar account 2.
Ben er nu langzaam een GUI omheen aan het bouwen (omdathetkan
Ik heb een button gemaakt en daar een function aan gekoppeld:
1
2
3
4
| Function Search { Start-Process -FilePath "C:\Windows\System32\rundll32.exe" -argumentList dsquery,OpenQueryWindow } |
Op de button drukken, wordt er een AD Search Window geopend. Kan er een user mee zoeken en vinden.
Nu de vraag, want dat is nogal lastig (in het begin

Hoe kan ik deze "user" dubbelklikken (vanuit de dsquery) om die in een Output/String/Value te stoppen? Waar kan ik beginnen met zoeken? (Want dan kan ik deze naar een textbox toe sturen, waarbij Textbox 1 de UserName van Account 1 bevat, enz. enz.)
Natuurlijk kan ik die TextBox ook handmatig invullen en die Function een "Get-AdUser" -achtige constructie geven. Maar vond de AD Search Box leuker om erin te programmeren
Toon je GUI eens en verduidelijk wat je wenst te verkrijgen.Dwazer schreef op dinsdag 28 mei 2019 @ 09:22:
Heel nieuw @ Powershell hier, so please bare with me![]()
Ben begonnen met het maken van een tooling, o.a. copy van user permissions van account 1 naar account 2.
Members only:
Alleen zichtbaar voor ingelogde gebruikers. Inloggen
Ben er nu langzaam een GUI omheen aan het bouwen (omdathetkan).
Ik heb een button gemaakt en daar een function aan gekoppeld:
code:
1 2 3 4 Function Search { Start-Process -FilePath "C:\Windows\System32\rundll32.exe" -argumentList dsquery,OpenQueryWindow }
Op de button drukken, wordt er een AD Search Window geopend. Kan er een user mee zoeken en vinden.
Nu de vraag, want dat is nogal lastig (in het begin):
Hoe kan ik deze "user" dubbelklikken (vanuit de dsquery) om die in een Output/String/Value te stoppen? Waar kan ik beginnen met zoeken? (Want dan kan ik deze naar een textbox toe sturen, waarbij Textbox 1 de UserName van Account 1 bevat, enz. enz.)
Natuurlijk kan ik die TextBox ook handmatig invullen en die Function een "Get-AdUser" -achtige constructie geven. Maar vond de AD Search Box leuker om erin te programmeren
Ook:
1 - Zoek eens naar PowerShell Studio 2019. Deze vergemakkelijkt het gebruik van GUI’s en PS code
2 - Ik raad altijd af om PS te gebruiken wanneer GUI’s van en interactie van te pas komen. Veel liever maak ik dan een mini C# app wat veel vlotter gaat imo
- BSc TI + CCNA R&S (Expired ofcourse) + CCNA SEC (Also expired ofc)-
PowerShell Studio compiled executables zijn zeker wel te reverse engineren hoor. Waar denk je dat de sleutel staat voor het encrypted blob stukje?mutsje schreef op dinsdag 14 mei 2019 @ 09:45:
@Xelefim Dit draaide als test lokaal op een werkstation en is als voorbeeld script bedoelt hoe de vraagsteller iets naar een SQL database kan schrijven. Als ik niet wil dat het uitgelezen wordt maak ik er simpelweg een executable van met powershell studio 2019. Deze zijn niet met reverse enginering open te breken..
Ik werk voor als security consultant en heb al meerdere malen credentials gevonden in executables op deze manier.
Wil ook wel een witte-up schrijven op tweakers als je dat interessant vind. Maak jij een executable en dan geef ik jou het PowerShell script door te reverse engineren.
In het verleden kreeg ik alleen al dmv het aanzetten van de transcript opties de volledige code te zien van Powershell scripts welke in een executable verpakt zitten.Squ1zZy schreef op dinsdag 11 juni 2019 @ 06:42:
[...]
PowerShell Studio compiled executables zijn zeker wel te reverse engineren hoor. Waar denk je dat de sleutel staat voor het encrypted blob stukje?
Ik werk voor als security consultant en heb al meerdere malen credentials gevonden in executables op deze manier.
Wil ook wel een witte-up schrijven op tweakers als je dat interessant vind. Maak jij een executable en dan geef ik jou het PowerShell script door te reverse engineren.
Dat werkt vanaf versie 2016 niet meer toch?Killah_Priest schreef op dinsdag 11 juni 2019 @ 09:45:
[...]
In het verleden kreeg ik alleen al dmv het aanzetten van de transcript opties de volledige code te zien van Powershell scripts welke in een executable verpakt zitten.
Geen idee om eerlijk te zijn. 2 jaar geleden werkte het nog in de (destijds) nieuwste build van Windows 10. Transcript settings via GPO ingericht en transcript file bevatte de complete code van het Powershell script welke verpakt zat in een exe.
Naderhand heb ik dit niet meer geprobeerd.
Overigens zal zo'n exe sowieso niet zo moeilijk zijn om door een decompiler te halen en de platte tekst zo zichtbaar te maken.
Ze maken wel gebruik van een encryptie en adverteren er ook mee. Echter zit de key natuurlijk in de executable en niet in het geencrypte gedeelte uiteraard. Door iLSpy halen en je hebt de key.Killah_Priest schreef op dinsdag 11 juni 2019 @ 10:36:
[...]
Geen idee om eerlijk te zijn. 2 jaar geleden werkte het nog in de (destijds) nieuwste build van Windows 10. Transcript settings via GPO ingericht en transcript file bevatte de complete code van het Powershell script welke verpakt zat in een exe.
Naderhand heb ik dit niet meer geprobeerd.
Overigens zal zo'n exe sowieso niet zo moeilijk zijn om door een decompiler te halen en de platte tekst zo zichtbaar te maken.
1
2
3
4
5
6
7
8
9
10
| $MailboxList= Get-Mailbox voorbeeld@voorbeeld.nl foreach ($Mailbox in $MailboxList) { $LegacyExchangeDN = "X500:$($Mailbox.LegacyExchangeDN)" Disable-Mailbox -Id $mailbox.Identity -Confirm:$False Enable-MailUser -Id $mailbox.Identity -ExternalEmailAddress $Mailbox.PrimarySmtpAddress.toString() Set-MailUser $mailbox.Identity -PrimarySmtpAddress $Mailbox.PrimarySmtpAddress.toString() -EmailAddressPolicyEnabled $false Set-MailUser $mailbox.Identity -EmailAddresses $LegacyExchangeDN -EmailAddressPolicyEnabled $false } |
Maar hij faalt met There is not primary smtp adres. Iemand een idee?
[ Voor 20% gewijzigd door Turdie op 18-07-2019 12:32 ]
Ik neem aan dat bij de eerste regel je in het eggie een andere input hebt dan slechts 1 email adres?shadowman12 schreef op donderdag 18 juli 2019 @ 10:40:
Ik probeer een script te maken om mailboxen in exchange om te zetten naar mail users:
PowerShell:
1 2 3 4 5 6 7 8 9 10 $MailboxList= Get-Mailbox voorbeeld@voorbeeld.nl foreach ($Mailbox in $MailboxList) { $LegacyExchangeDN = "X500:$($Mailbox.LegacyExchangeDN)" Disable-Mailbox -Id $mailbox.Identity -Confirm:$False Enable-MailUser -Id $mailbox.Identity -ExternalEmailAddress $Mailbox.PrimarySmtpAddress.toString() Set-MailUser $mailbox.Identity -PrimarySmtpAddress $Mailbox.PrimarySmtpAddress.toString() -EmailAddressPolicyEnabled $false Set-MailUser $mailbox.Identity -EmailAddresses $LegacyExchangeDN -EmailAddressPolicyEnabled $false }
Maar hij faalt met There is not primary smtp adres. Iemand een idee?
Waar het misgaat is denk ik rij 7 met je ".toString()". Haal dat eens weg, dus alleen: $mailbox.primarysmtpaddress.
(zelfde geldt voor rij 8 )
no animals were harmed during the production of this message
Dat heb ik al getest dat werkt ook nietCaeruleus schreef op donderdag 18 juli 2019 @ 12:56:
[...]
Ik neem aan dat bij de eerste regel je in het eggie een andere input hebt dan slechts 1 email adres?
Waar het misgaat is denk ik rij 7 met je ".toString()". Haal dat eens weg, dus alleen: $mailbox.primarysmtpaddress.
(zelfde geldt voor rij 8 )
Kijk eerst eens waar het exact mis gaat. Dus run het script regel voor regel.shadowman12 schreef op donderdag 18 juli 2019 @ 12:58:
[...]
Dat heb ik al getest dat werkt ook niet
no animals were harmed during the production of this message
That has been done beforeshadowman12 schreef op donderdag 18 juli 2019 @ 10:40:
Ik probeer een script te maken om mailboxen in exchange om te zetten naar mail users:
PowerShell:
1 2 3 4 5 6 7 8 9 10 $MailboxList= Get-Mailbox voorbeeld@voorbeeld.nl foreach ($Mailbox in $MailboxList) { $LegacyExchangeDN = "X500:$($Mailbox.LegacyExchangeDN)" Disable-Mailbox -Id $mailbox.Identity -Confirm:$False Enable-MailUser -Id $mailbox.Identity -ExternalEmailAddress $Mailbox.PrimarySmtpAddress.toString() Set-MailUser $mailbox.Identity -PrimarySmtpAddress $Mailbox.PrimarySmtpAddress.toString() -EmailAddressPolicyEnabled $false Set-MailUser $mailbox.Identity -EmailAddresses $LegacyExchangeDN -EmailAddressPolicyEnabled $false }
Maar hij faalt met There is not primary smtp adres. Iemand een idee?
Zie onder andere https://mikecrowley.us/20...d-not-loosing-attributes/
Freelance (Microsoft) Cloud Consultant & Microsoft Certified Trainer
Werkt ook niet. Wij kunnen $mailbox.alias +"@domain.com niet gebruiken,omdsat de alias niet de voor en achternaam heeft van de gebruiker.Enable-MailUser : Cannot bind parameter 'ExternalEmailAddress'. Cannot convert the value of type " Microsoft.Exchange.Data.SmtpAddress" to type "Microsoft.Exchange.Data.ProxyAddress".ralpje schreef op donderdag 18 juli 2019 @ 13:01:
[...]
That has been done before
Zie onder andere https://mikecrowley.us/20...d-not-loosing-attributes/
Dit is wat wel werkt:
Stap 1
1
2
3
4
5
6
| foreach ($Mailbox in $MailboxList) { $LegacyExchangeDN = "X500:$($Mailbox.LegacyExchangeDN)" Disable-Mailbox -Id $mailbox.Identity -Confirm:$False } |
Stap 2
1
2
| $enableuser = Get-User mail adres $enableusers | foreach { Enable-MailUser $_ -externalEmailAddress $_.WindowsEmailAddress.toString() } |
Hoe ik dat in een script krijg met een LegacyExchangeDN is me nog een raadsel. Vandaar dat ik met toString() ben gaan spelen
Ik probeer juist mailboxen te converteren naar mail user. Maar er is een Set-MailUser \parameter die ik erachter kan zetten zodat de email adres policy niet wordt toegepast, maar dan werkt het ook nietAppel schreef op donderdag 18 juli 2019 @ 13:00:
Heeft het er niet mee te maken dat je eerst je mailbox aan moet maken zonder e-mail adres policy en dan pas je external mail adres moet toepassen?
-EmailAddressPolicyEnabled $false
[ Voor 37% gewijzigd door Turdie op 19-07-2019 11:45 ]
Ik heb een script gemaakt, dat binnen een heleboel word documenten een aantal woorden moet vinden. Als deze woorden worden gevonden, dan moet dit document worden getoond. Het probleem is, dat het script ook de woorden in documenten denkt te vinden waar ze beslist niet in staan.
Kan iemand mij aangeven wat ik fout doe en wat het dan wel moet zijn?
Vast bedankt.
#Client modules laden (https://www.microsoft.com...oad/details.aspx?id=42038)
Add-Type -Path "c:\Program Files\Common Files\microsoft shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "c:\Program Files\Common Files\microsoft shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"
Add-Type -Path "c:\Program Files\Common Files\microsoft shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Search.dll"
if (Test-Path -path "C:\TEMP\encrypted.xml"){
#Username en password gehashed ophalen
$UserCred = Import-Clixml -Path "C:\TEMP\encrypted.xml"
$username = $UserCred.UserName
$password = $UserCred.Password
}Else{
#Maken gehashde xml (Per machine & User verschillend)
Get-Credential | Export-Clixml -Path C:\TEMP\encrypted.xml
}
#Site om verbinding mee te maken
$siteUrl = "https://mijnsite.sharepoint.com/sites/test"
#Folder om mee verbinding te maken
$team = Read-Host -Prompt "Team "
$jaar = Read-Host -Prompt "2019-2020"
$SourceFolder = "//mijnsite.sharepoint.com/sites/test/Gedeelde documenten/map1/map2/$team/$jaar"
cd $SourceFolder
#Keywords waarop gezocht moet worden
$keyword1 = "25189"
$keyword2 = "2017"
$keyword3 = "plan"
#Verbind via de SP client context
$ctx = New-Object Microsoft.SharePoint.Client.ClientContext($siteUrl)
$credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($username, $password)
$ctx.Credentials = $credentials
$rootWeb = $ctx.Web
$sites = $rootWeb.Webs
$ctx.Load($rootWeb)
$ctx.Load($sites)
$ctx.ExecuteQuery()
#Variables
$ServerRelativeUrl= "/Sites/test/Gedeelde documenten/map1/map2/$team/$jaar"
Try {
#Setup the context
$Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
$Ctx.Credentials = $Credentials
#Get the web from URL
$Web = $Ctx.web
$Ctx.Load($Web)
$Ctx.executeQuery()
#Get the Folder object by Server Relative URL
$Folder = $Web.GetFolderByServerRelativeUrl($ServerRelativeUrl)
$Ctx.Load($Folder)
$Ctx.ExecuteQuery()
#Get Some Folder Properties
Write-host -f Yellow $Folder.Name #"Total Number of Files in the Folder:"$Folder.ItemCount
}
Catch {
write-host -f Red "Error Getting Folder!" $_.Exception.Message
}
$Word = New-Object -ComObject Word.Application
$docs = Get-ChildItem -Path $SourceFolder -Recurse| Where-Object {$_.Name -like '*.doc*'}
foreach ($doc in $docs)
{
$condition1 = $word.Documents.Open($doc.FullName).Content.Find.Execute($keyword1,$true,$true)
$condition2 = $word.Documents.Open($doc.FullName).Content.Find.Execute($keyword2,$true,$true)
$condition3 = $word.Documents.Open($doc.FullName).Content.Find.Execute($keyword3,$true,$true)
if ($condition1 -and $condition2 -and $condition3)
{
$word.Application.ActiveDocument.Close()
Write-Host "$doc contains $keyword1 and $keyword2 and $keyword3"
}
else
{
$word.Application.ActiveDocument.Close()
Write-Host "$doc does not contain $keyword1 and $keyword2 and $keyword3"
}
Write-host -f Green $doc.Name
}
$document.close()
Write-Host $doc.FullName
Stop-Process -Name "WINWORD"
Tot nu toe maakte ik elke keer nog Scheduledtask handmatig aan maar ik wil eens gaan kijken of scheduledJobs niet beter en handiger is, data kan weer teruggehaald worden in de shell i.p.v. data in log bestandjes te bekijken.
Ik zit er aan te denken om een beheer pc in te richten waar vandaan ik meerdere scriptjes draai op geplande tijden om zo wat werk te gaan automatiseren. Hoe gaan jullie daar mee om? Dit zou e.v.t. een Windows 10 core machine worden zonder GUI zodat het ergens light kan draaien.
De machine wordt dan zelf een soort van taakplanner om scripts op verschillende systemen te draaien i.p.v. dat ik de scripts op alle servers/pc's heb draaien en elke keer de juiste pc erbij pak om de resultaten te bekijken.
😲
Ik zou het is proberen met een -Include in Get-ChildItemMicronikje schreef op woensdag 9 oktober 2019 @ 20:45:
Beste allemaal,
Ik heb een script gemaakt, dat binnen een heleboel word documenten een aantal woorden moet vinden. Als deze woorden worden gevonden, dan moet dit document worden getoond. Het probleem is, dat het script ook de woorden in documenten denkt te vinden waar ze beslist niet in staan.
Kan iemand mij aangeven wat ik fout doe en wat het dan wel moet zijn?
Vast bedankt.
#Client modules laden (https://www.microsoft.com...oad/details.aspx?id=42038)
Add-Type -Path "c:\Program Files\Common Files\microsoft shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "c:\Program Files\Common Files\microsoft shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"
Add-Type -Path "c:\Program Files\Common Files\microsoft shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Search.dll"
if (Test-Path -path "C:\TEMP\encrypted.xml"){
#Username en password gehashed ophalen
$UserCred = Import-Clixml -Path "C:\TEMP\encrypted.xml"
$username = $UserCred.UserName
$password = $UserCred.Password
}Else{
#Maken gehashde xml (Per machine & User verschillend)
Get-Credential | Export-Clixml -Path C:\TEMP\encrypted.xml
}
#Site om verbinding mee te maken
$siteUrl = "https://mijnsite.sharepoint.com/sites/test"
#Folder om mee verbinding te maken
$team = Read-Host -Prompt "Team "
$jaar = Read-Host -Prompt "2019-2020"
$SourceFolder = "//mijnsite.sharepoint.com/sites/test/Gedeelde documenten/map1/map2/$team/$jaar"
cd $SourceFolder
#Keywords waarop gezocht moet worden
$keyword1 = "25189"
$keyword2 = "2017"
$keyword3 = "plan"
#Verbind via de SP client context
$ctx = New-Object Microsoft.SharePoint.Client.ClientContext($siteUrl)
$credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($username, $password)
$ctx.Credentials = $credentials
$rootWeb = $ctx.Web
$sites = $rootWeb.Webs
$ctx.Load($rootWeb)
$ctx.Load($sites)
$ctx.ExecuteQuery()
#Variables
$ServerRelativeUrl= "/Sites/test/Gedeelde documenten/map1/map2/$team/$jaar"
Try {
#Setup the context
$Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
$Ctx.Credentials = $Credentials
#Get the web from URL
$Web = $Ctx.web
$Ctx.Load($Web)
$Ctx.executeQuery()
#Get the Folder object by Server Relative URL
$Folder = $Web.GetFolderByServerRelativeUrl($ServerRelativeUrl)
$Ctx.Load($Folder)
$Ctx.ExecuteQuery()
#Get Some Folder Properties
Write-host -f Yellow $Folder.Name #"Total Number of Files in the Folder:"$Folder.ItemCount
}
Catch {
write-host -f Red "Error Getting Folder!" $_.Exception.Message
}
$Word = New-Object -ComObject Word.Application
$docs = Get-ChildItem -Path $SourceFolder -Recurse| Where-Object {$_.Name -like '*.doc*'}
foreach ($doc in $docs)
{
$condition1 = $word.Documents.Open($doc.FullName).Content.Find.Execute($keyword1,$true,$true)
$condition2 = $word.Documents.Open($doc.FullName).Content.Find.Execute($keyword2,$true,$true)
$condition3 = $word.Documents.Open($doc.FullName).Content.Find.Execute($keyword3,$true,$true)
if ($condition1 -and $condition2 -and $condition3)
{
$word.Application.ActiveDocument.Close()
Write-Host "$doc contains $keyword1 and $keyword2 and $keyword3"
}
else
{
$word.Application.ActiveDocument.Close()
Write-Host "$doc does not contain $keyword1 and $keyword2 and $keyword3"
}
Write-host -f Green $doc.Name
}
$document.close()
Write-Host $doc.FullName
Stop-Process -Name "WINWORD"
Weet niet of mijn methode de meest geschikte is, ik heb alle scripts in 1 folder staan en elk script heeft in de naam iets als _runeveryday_ of _runevery2hour_ enz...mswp schreef op woensdag 23 oktober 2019 @ 15:19:
Hoe zijn jullie ervaringen met ScheduledJobs?
Tot nu toe maakte ik elke keer nog Scheduledtask handmatig aan maar ik wil eens gaan kijken of scheduledJobs niet beter en handiger is, data kan weer teruggehaald worden in de shell i.p.v. data in log bestandjes te bekijken.
Ik zit er aan te denken om een beheer pc in te richten waar vandaan ik meerdere scriptjes draai op geplande tijden om zo wat werk te gaan automatiseren. Hoe gaan jullie daar mee om? Dit zou e.v.t. een Windows 10 core machine worden zonder GUI zodat het ergens light kan draaien.
De machine wordt dan zelf een soort van taakplanner om scripts op verschillende systemen te draaien i.p.v. dat ik de scripts op alle servers/pc's heb draaien en elke keer de juiste pc erbij pak om de resultaten te bekijken.
Dan heb ik 1 master script draaien die scant de folder en die start wanneer nodig de diverse scripts.
Zo kan ik er naar gelang snel scripts bij zetten of uitzetten zodra je 10+ scripts hebt wordt het bij houden van je taskscheduler een heel gedoe waar weer van alles fout kan gaan.
voor mij werkt het handig maar zijn vast betere methodes,
Weinig tot geen verschil met Scheduled Task. Ik steek mijn scripts met een recurring occurence liever centraal waarbij ik tot een mooi overzicht bekom onder 1 centrale folder (met daarin PS1, bat's,...). Tevens als ik in de toekomst wegens veiligheid / pottenkijkers een ps1 tot een exe moet compilen, kan ik dit nog steeds in de taskscheduler gebruiken.mswp schreef op woensdag 23 oktober 2019 @ 15:19:
Hoe zijn jullie ervaringen met ScheduledJobs?
- BSc TI + CCNA R&S (Expired ofcourse) + CCNA SEC (Also expired ofc)-
@Xelefim Die centrale map? Waar heb jij die staan? Ik mis in jou verhaal ook nog het stukje periodiek zelfstandig laten draaien, dus jobs/tasks. Hoe ga jij daar mee om?
😲
Ik zit momenteel net aan op 50 scripts het master script scant om de 5 minuten de folder en als er iets uitgevoerd moet worden gaat dat 1 voor 1.mswp schreef op donderdag 24 oktober 2019 @ 08:13:
@Thijs B Zeker waar dat taskscheduler ook de nodige fouten met zich mee kan brengen. Met jou methode, wat als ik uiteindelijk meer dan 100 scripts wil runnen? Krijg je dan niet verschrikkelijk veel load als je die allemaal in 1 keer wil uitvoeren?
Kan mij voorstellen in een zeer grote omgeving met 100+ zware scripts dat je dan in mijn geval het master script iets intelligenter moet maken zodat het een aantal scripts tegelijk kan draaien.
Maarrr in een zeer grote omgeving moet je je misschien ook afvragen of mijn methode wel veilig genoeg is.
Ik heb dat zelf gedaan via Jenkins. Is eigenlijk bedoeld voor CI/CD maar kun je ook prima gebruiken als Task Scheduler, Bijkomend voordeel; het is webbased, iedereen met de juiste rechten kan taken bekijken en uitoveren, het is transparant, je kunt dashboards bouwen zodat je inzicht hebt in welke taken draaien en welke misgaan. Je kunt eenvoudig Pester tests includen. En je hebt per taak gewoon logging.mswp schreef op woensdag 23 oktober 2019 @ 15:19:
Hoe zijn jullie ervaringen met ScheduledJobs?
Tot nu toe maakte ik elke keer nog Scheduledtask handmatig aan maar ik wil eens gaan kijken of scheduledJobs niet beter en handiger is, data kan weer teruggehaald worden in de shell i.p.v. data in log bestandjes te bekijken.
Ik zit er aan te denken om een beheer pc in te richten waar vandaan ik meerdere scriptjes draai op geplande tijden om zo wat werk te gaan automatiseren. Hoe gaan jullie daar mee om? Dit zou e.v.t. een Windows 10 core machine worden zonder GUI zodat het ergens light kan draaien.
De machine wordt dan zelf een soort van taakplanner om scripts op verschillende systemen te draaien i.p.v. dat ik de scripts op alle servers/pc's heb draaien en elke keer de juiste pc erbij pak om de resultaten te bekijken.
Ik heb op deze manier een on/off boarding process ge-automatiseerd. (Geen centjes voor een fatsoenlijke IAM oplossing).
[ Voor 4% gewijzigd door mufana op 29-10-2019 09:59 ]
Dat ziet er opzich ook nog wel bruikbaar uit. Hor zit dit met beveiliging? Heb je dit op een aparte server draaien die in het domein zit?mufana schreef op dinsdag 29 oktober 2019 @ 09:45:
[...]
Ik heb dat zelf gedaan via Jenkins. Is eigenlijk bedoeld voor CI/CD maar kun je ook prima gebruiken als Task Scheduler, Bijkomend voordeel; het is webbased, iedereen met de juiste rechten kan taken bekijken en uitoveren, het is transparant, je kunt dashboards bouwen zodat je inzicht hebt in welke taken draaien en welke misgaan. Je kunt eenvoudig Pester tests includen. En je hebt per taak gewoon logging.
Ik heb op deze manier een on/off boarding process ge-automatiseerd. (Geen centjes voor een fatsoenlijke IAM oplossing).
😲
Ja meestal draait Jenkins op een aparte server, draait het beste op Linux. Is wel Java gebaseerd. Jenkins neemt security best serieus. Zie hun website wat voor security maatregelen je kan treffen.mswp schreef op dinsdag 29 oktober 2019 @ 17:24:
[...]
Dat ziet er opzich ook nog wel bruikbaar uit. Hor zit dit met beveiliging? Heb je dit op een aparte server draaien die in het domein zit?
[ Voor 12% gewijzigd door Turdie op 29-10-2019 17:30 ]
Jenkins inderdaad zoals genoemd, alternatief is ControlM.mswp schreef op woensdag 23 oktober 2019 @ 15:19:
Hoe zijn jullie ervaringen met ScheduledJobs?
Tot nu toe maakte ik elke keer nog Scheduledtask handmatig aan maar ik wil eens gaan kijken of scheduledJobs niet beter en handiger is, data kan weer teruggehaald worden in de shell i.p.v. data in log bestandjes te bekijken.
Ik zit er aan te denken om een beheer pc in te richten waar vandaan ik meerdere scriptjes draai op geplande tijden om zo wat werk te gaan automatiseren. Hoe gaan jullie daar mee om? Dit zou e.v.t. een Windows 10 core machine worden zonder GUI zodat het ergens light kan draaien.
De machine wordt dan zelf een soort van taakplanner om scripts op verschillende systemen te draaien i.p.v. dat ik de scripts op alle servers/pc's heb draaien en elke keer de juiste pc erbij pak om de resultaten te bekijken.
Nou er zijn nog wel meer CI/CD tools.Pimmerd schreef op dinsdag 29 oktober 2019 @ 20:39:
[...]
Jenkins inderdaad zoals genoemd, alternatief is ControlM.
Ik heb het op Windows draaien. Draait prima hoor. Alleen op Windows wel even zorgen dat Jenkins in 64bit mode draait. (Default is 32bits) om te voorkomen dat je ook 32bits PowerShell sessies gaat starten. Dat is niet zo handig. Verder is Jenkins gekoppeld aan de interne AD. Dus alleen ge-authoriseerde admins kunnen op Jenkins inloggen.mswp schreef op dinsdag 29 oktober 2019 @ 17:24:
[...]
Dat ziet er opzich ook nog wel bruikbaar uit. Hor zit dit met beveiliging? Heb je dit op een aparte server draaien die in het domein zit?
Er is een enorme hoeveelheid aan plugins die je kunt installeren om Jenkins te verreiken. Bv. om credentials die je binnen scripts nodig hebt binnen Jenkins te configureren en te gebruiken in je scripts. Maar ook plugins voor integratie naar bv. Slack.
En Jenkins heeft zelf ook een aardig gedocumenteerde API. Dus je kunt zelf ook weer andere applicaties (bv een ticket systeem) koppelen aan Jenkins En bijkomend voordeel, je kunt Jenkins eenvoudig koppelen aan Source Control.
Er is trouwens ook een heel fijn Docker image voor Jenkins!
[ Voor 9% gewijzigd door mufana op 29-10-2019 22:49 ]
Klopt er zijn er heel veel. Voordeel van Jenkins is dat het Open Source is. Zodoende een grote community die altijd willen helpen, er zijn veel docs en how-to's. Dat maakt het een vrij laagdrempelige tool om te gebruiken.Pimmerd schreef op dinsdag 29 oktober 2019 @ 20:39:
[...]
Jenkins inderdaad zoals genoemd, alternatief is ControlM.
Staat gewoon onder de Microsoft map in de taskscheduler (links boven zie je folders) .mswp schreef op donderdag 24 oktober 2019 @ 08:13:
@Thijs B Zeker waar dat taskscheduler ook de nodige fouten met zich mee kan brengen. Met jou methode, wat als ik uiteindelijk meer dan 100 scripts wil runnen? Krijg je dan niet verschrikkelijk veel load als je die allemaal in 1 keer wil uitvoeren?
@Xelefim Die centrale map? Waar heb jij die staan? Ik mis in jou verhaal ook nog het stukje periodiek zelfstandig laten draaien, dus jobs/tasks. Hoe ga jij daar mee om?
Periodiek zelfstandig laten draaien?
Wat is het verschil tussen periodiek zelfstandig laten draaien + de triggers van task scheduler?
Ik heb bv een powershell script die dagelijks 1x per dag de disk space checkt en indien nodig een mail stuurt.
- BSc TI + CCNA R&S (Expired ofcourse) + CCNA SEC (Also expired ofc)-
Het ging erom dat wanneer je veel powershell script hebt, het niet meer beheersbaar is om die via task scheduler te runnen, dat wordt totaal onoverzichtelijk en veel kans op fouten.Xelefim schreef op woensdag 30 oktober 2019 @ 09:14:
[...]
Staat gewoon onder de Microsoft map in de taskscheduler (links boven zie je folders) .
Periodiek zelfstandig laten draaien?
Wat is het verschil tussen periodiek zelfstandig laten draaien + de triggers van task scheduler?
Ik heb bv een powershell script die dagelijks 1x per dag de disk space checkt en indien nodig een mail stuurt.
Dat is zeker waar! Scripts hebben sowieso de neiging om op veel verschillende servers te leven waardoor je snel overzicht kwijt raakt van wat er allemaal gebeurd en wanneer. (En uiteindelijk ook waarom). En als er dan iets misgaat ben je de sjaak. Welk script is daar dan voor verantwoordelijk.Thijs B schreef op woensdag 30 oktober 2019 @ 12:51:
[...]
Het ging erom dat wanneer je veel powershell script hebt, het niet meer beheersbaar is om die via task scheduler te runnen, dat wordt totaal onoverzichtelijk en veel kans op fouten.
En de taskscheduler is ook niet bepaald heel user-friendly.
Niet voor niets gebruiken grotere bedrijven de Windows Task Scheduler ook niet. Die willen een tool waarmee je die jobs centraal kunt beheren. Soms zelfs tools waarmee je ook de jobs op Unix servers kunt beheren.mufana schreef op woensdag 30 oktober 2019 @ 13:18:
[...]
Dat is zeker waar! Scripts hebben sowieso de neiging om op veel verschillende servers te leven waardoor je snel overzicht kwijt raakt van wat er allemaal gebeurd en wanneer. (En uiteindelijk ook waarom). En als er dan iets misgaat ben je de sjaak. Welk script is daar dan voor verantwoordelijk.
Ik wil graag een goed boek bestellen om in Powershell te duiken.
Ik heb er wel wat ervaring mee, maar wil helemaal vanaf nul beginnen.
Ik begreep dat de Learn Powershell in a month of lunches erg goed zijn.
Nu zie ik alleen 2 verschillende versies, welke moet ik nemen ?
Boek 1:
https://www.bol.com/nl/p/...7xOcw.1_9.13.ProductImage
Boek 2:
https://www.bol.com/nl/p/...B-tG1A.1_4.5.ProductTitle
MCSE NT4/2K/2K3, MCTS, MCITP, CCA, CCEA, CCEE, CCIA, CCNA, CCDA, CCNP, CCDP, VCP, CEH + zwemdiploma A & B
Ik zou de basis zelf leren via online resources, kijken in wat je je mogelijk zal specialiseren en hierna een specialisatie boek kopen (bv: powershell for exchange, powershell for sharepoint, powershell for system admins,...)So_Surreal schreef op woensdag 27 november 2019 @ 12:14:
Hey allemaal,
Ik wil graag een goed boek bestellen om in Powershell te duiken.
Ik heb er wel wat ervaring mee, maar wil helemaal vanaf nul beginnen.
Ik begreep dat de Learn Powershell in a month of lunches erg goed zijn.
Nu zie ik alleen 2 verschillende versies, welke moet ik nemen ?
Boek 1:
https://www.bol.com/nl/p/...7xOcw.1_9.13.ProductImage
Boek 2:
https://www.bol.com/nl/p/...B-tG1A.1_4.5.ProductTitle
- BSc TI + CCNA R&S (Expired ofcourse) + CCNA SEC (Also expired ofc)-
Nou Learn PowerShell in Month Lunches is erg goed boek om de basis goed te snappen, dus dat zijn ook mijn voorkeur hebben als ik zou beginnen met PowerShell. En bij dat boek weet je zeker dat het je goed aangeleerd, online resources kunnen wel is wat fouten bevatten.Xelefim schreef op woensdag 27 november 2019 @ 14:52:
[...]
Ik zou de basis zelf leren via online resources, kijken in wat je je mogelijk zal specialiseren en hierna een specialisatie boek kopen (bv: powershell for exchange, powershell for sharepoint, powershell for system admins,...)
[ Voor 9% gewijzigd door Turdie op 27-11-2019 15:30 ]
Weet jij welke van de door mij bovengenoemde boeken ik het beste kan kiezen ?shadowman12 schreef op woensdag 27 november 2019 @ 15:29:
[...]
Nou Learn PowerShell in Month Lunches is erg goed boek om de basis goed te snappen, dus dat zijn ook mijn voorkeur hebben als ik zou beginnen met PowerShell. En bij dat boek weet je zeker dat het je goed aangeleerd, online resources kunnen wel is wat fouten bevatten.
Ik begrijp niet helemaal waar het verschil hem in zit.
Zviw ik weet verschillende PowerShell versies in de Learn PowerShell in a Month of Lunches, Don Jones is er een aantal jaren geleden al mee begonnen en sinsdien zijn er wat versies van PowerShell uitgekomen waar het boek op is aangepast.So_Surreal schreef op vrijdag 29 november 2019 @ 10:29:
[...]
Weet jij welke van de door mij bovengenoemde boeken ik het beste kan kiezen ?
Ik begrijp niet helemaal waar het verschil hem in zit.
Maar ik zou het boek hier bij de uitgever bestellen:
https://www.manning.com/b...ing-in-a-month-of-lunches
Of hetzelfde ISBN hier bij bol.com bestellen:
https://www.bol.com/nl/p/...xVhFBw.1_4.5.ProductTitle
[ Voor 17% gewijzigd door Turdie op 29-11-2019 11:18 ]
Die boeken die @So_Surreal postte dat zijn wel twee verschillende boeken. Die ik linkte dat is dezelfde. Maar als je het boek bij de uitgever besteld krijg je er ook een ebook bij, dat kan wel handig zijn,downtime schreef op vrijdag 29 november 2019 @ 12:15:
Het zijn zo te zien verschillend boeken: Powershell in a month of lunches en Powershell Scripting in a month of lunches.
Gevonden:
FOR THE TOTAL BEGINNER. If you’re a total beginner, and maybe not even sure what a “server” is, start with Don Jones’ PowerShell 4N00bs, which Don authored solo. Focused on PowerShell Core, this book will give you the absolute basics, and get you ready for more advanced books on the topic. After reading this, move on to the next book on this list.
MOVING INTO PRACTICAL WORK. If you’ve got some server administration experience under your belt, or you made it through the 4N00bs book, then grab Learn PowerShell in a Month of Lunches (presently in its 3rd Edition). This is the starting point, where you read a chapter a day and learn how to use the shell the way it wants to be used. This isn’t a programming book – this is just the shell as a command-line shell. We cover all the gotchas that you’ll never figure out on your own, and get you positioned to be effective with the shell in just four weeks of reading. This book does focus on Windows PowerShell, not PowerShell Core, but it’s over 90% applicable to PowerShell Core. You may just find that some of the examples aren’t as Core-friendly.
BUILDING YOUR OWN TOOLS. Then, move on to PowerShell Scripting in a Month of Lunches (formerly Learn PowerShell Toolmaking in a Month of Lunches; this is a complete rewrite of that book). Even if you have zero programming background, we’ll have you producing automation tools that follow PowerShell’s native patterns and practices. Especially useful for folks who do have programming experience and tend to stray off the path in terms of how PowerShell wants to be scripted. This is an entry level book with a strong focus on patterns, tons of examples, and introductions to the higher-level areas of scripting. 100% applicable to PowerShell Core, although the running examples are Windows-specific.
Bron:https://donjones.com/powershell/
[ Voor 102% gewijzigd door Turdie op 29-11-2019 18:57 ]
Zijn verschillende boeken.So_Surreal schreef op woensdag 27 november 2019 @ 12:14:
Hey allemaal,
Ik wil graag een goed boek bestellen om in Powershell te duiken.
Ik heb er wel wat ervaring mee, maar wil helemaal vanaf nul beginnen.
Ik begreep dat de Learn Powershell in a month of lunches erg goed zijn.
Nu zie ik alleen 2 verschillende versies, welke moet ik nemen ?
Boek 1:
https://www.bol.com/nl/p/...7xOcw.1_9.13.ProductImage
Boek 2:
https://www.bol.com/nl/p/...B-tG1A.1_4.5.ProductTitle
PowerShell in a month of lunches is meer gericht op de basis en je eerste stappen zetten in de wereld van PowerShell.
PowerShell Scripting in a month of lunches is een vervolg en gaat meer over: 'hoe maak je van al die cmdlets een degelijke tool'.
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.
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.
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.
@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?
1
| -like |
1
| -match |
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)-
[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)-
[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.
Pick your poison:
http://poshcode.org/slack
http://poshcode.org/discord
[ Voor 5% gewijzigd door Lampiz op 16-12-2019 20:33 ]
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 ]
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!
😲