Goto in Powershell

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • rolfkunst
  • Registratie: Mei 2007
  • Laatst online: 14-08 09:12
Hallo medetweakers,

Ik zit met een klein vraagstuk. Ik ben bezig voor een collega een script te maken waarin hij de mogelijkheid heeft om te zien welke gebruiker lid is van welke mailgroepen

Nu heb ik dat script af, maar het verbinden met de mailserver duurt erg lang. Dus het zou fijn zijn als hij eenmalig de verbinding legt met de mailserver, en ik dan via een goto of loop scriptje telkens naar de invulling van de gebruikersnaam kan gaan.

Wat heb ik nu? (sorry voor de opmaak, ben er nog niet zo handig in)

code:
1
2
3
4
5
6
7
8
9
10
11
12
$UserCredential = Get-Credential
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://mailserverFQDN/PowerShell/ -Authentication Kerberos -Credential $UserCredential
Import-PSSession $Session -DisableNameChecking
CLS

$Username = Read-Host -Prompt 'Vul hier het mailadres van de gebruiker in'

$DistributionGroups= Get-DistributionGroup | where { (Get-DistributionGroupMember $_.Alias | foreach {$_.PrimarySmtpAddress}) -contains "$Username"}

$DistributionGroups
PAUSE
Remove-PSSession $Session


En ik wil dan "goto'en/loopen" tussen de CLS en de PAUSE

Dat scheelt heel veel tijd, want alleen de eerste drie regels, het verbinden met de mailserver duurt al een minuut ongeveer.

Ik heb wel al een en ander uitgezocht, maar als ik dit zie, dan haak ik helaas af:

code:
1
2
3
For ($i=0; $i -le 10; $i++) {
    "10 * $i = " + (10 * $i)
    }


Geen flauw idee hoe ik dit in mijn script zou moeten implementeren.

Alle reacties


Acties:
  • 0 Henk 'm!

  • TECHcrime
  • Registratie: Februari 2008
  • Laatst online: 22-09 09:09
Makkelijkste manier lijkt me om het deel in een Function te zetten en dan een check te doen of $username een waarde bevat. Als $username een waarde bevat, kan je de functie opnieuw aanroepen, of als $username geen waarde bevat, het script afronden.

Edit:
Er zullen vast betere manieren zijn (En ik heb deze niet getest omdat ik geen mailserver ter beschikking heb zo snel..)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$UserCredential = Get-Credential
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://mailserverFQDN/PowerShell/ -Authentication Kerberos -Credential $UserCredential
Import-PSSession $Session -DisableNameChecking

Function Get-Dist {
    cls
    $Username = Read-Host -Prompt 'Vul hier het mailadres van de gebruiker in'
    $DistributionGroups= Get-DistributionGroup | where { (Get-DistributionGroupMember $_.Alias | foreach {$_.PrimarySmtpAddress}) -contains "$Username"}
    Write-Host $DistributionGroups
    pause

    if ($Username) { 
        Write-Host "Username found. Allowing another check." 
        Get-Dist
    } else {
        Write-Host "Username empty. Terminating script."
    }
}

Get-Dist
Remove-PSSession $Session

[ Voor 65% gewijzigd door TECHcrime op 10-09-2021 14:22 ]


Acties:
  • 0 Henk 'm!

  • rolfkunst
  • Registratie: Mei 2007
  • Laatst online: 14-08 09:12
Dank je wel, ik ga testen, ik laat weten wat er uitgekomen is.

  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

TECHcrime schreef op vrijdag 10 september 2021 @ 14:09:
Makkelijkste manier lijkt me om het deel in een Function te zetten en dan een check te doen of $username een waarde bevat. Als $username een waarde bevat, kan je de functie opnieuw aanroepen, of als $username geen waarde bevat, het script afronden.

Edit:
Er zullen vast betere manieren zijn (En ik heb deze niet getest omdat ik geen mailserver ter beschikking heb zo snel..)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$UserCredential = Get-Credential
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://mailserverFQDN/PowerShell/ -Authentication Kerberos -Credential $UserCredential
Import-PSSession $Session -DisableNameChecking

Function Get-Dist {
    cls
    $Username = Read-Host -Prompt 'Vul hier het mailadres van de gebruiker in'
    $DistributionGroups= Get-DistributionGroup | where { (Get-DistributionGroupMember $_.Alias | foreach {$_.PrimarySmtpAddress}) -contains "$Username"}
    Write-Host $DistributionGroups
    pause

    if ($Username) { 
        Write-Host "Username found. Allowing another check." 
        Get-Dist
    } else {
        Write-Host "Username empty. Terminating script."
    }
}

Get-Dist
Remove-PSSession $Session
Wat je daar doet is een recursieve functie (vanuit Get-Dist de functie Get-Dist aanroepen) en dat is een afrader. Het lijkt mij netter om het als volgt te doen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$UserCredential = Get-Credential
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://mailserverFQDN/PowerShell/ -Authentication Kerberos -Credential $UserCredential
Import-PSSession $Session -DisableNameChecking

Do {
    cls
    $Username = Read-Host -Prompt 'Vul hier het mailadres van de gebruiker in'

    if ($Username) { 
        $DistributionGroups= Get-DistributionGroup | Where { ( Get-DistributionGroupMember $_.Alias | foreach {$_.PrimarySmtpAddress} ) -contains "$Username"}
        Write-Host $DistributionGroups
        Write-Host "Username found. Allowing another check." 
        pause
    }
} while ($Username)

Write-Host "Username empty. Terminating script."
Remove-PSSession $Session

De regel met recursieve code is: Niet gebruiken tenzij het echt niet anders kan. Het is lastig te volgen en nog lastiger te debuggen, zeker als de code wat complexer wordt dan hier, want je krijgt snel te maken met moeilijk te volgen issues rond scoping van variabelen en wat andere zaken.

Sowieso is het raar om na het invoeren van een lege $Username eerst alsnog de code te doorlopen waar je iets met die $Username doet en dan daarna pas te checken of $Username niet leeg is. Dat zal in sommige situaties wel werken maar netjes is het nooit.

Bij gebrek aan een mailserver heb ik de code trouwens ook niet kunnen testen.

  • Poltergeist
  • Registratie: Oktober 2000
  • Laatst online: 18:13
Gewoon een while loop gebruiken? Of is dat te simpel? (eigenlijk hetzelfde als hierboven)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$UserCredential = Get-Credential
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://mailserverFQDN/PowerShell/ -Authentication Kerberos -Credential $UserCredential
Import-PSSession $Session -DisableNameChecking
CLS

$Username = Read-Host -Prompt 'Vul hier het mailadres van de gebruiker in'
while ($Username -ne "") {
$DistributionGroups= Get-DistributionGroup | where { (Get-DistributionGroupMember $_.Alias | foreach {$_.PrimarySmtpAddress}) -contains "$Username"}

$DistributionGroups
PAUSE
$Username = Read-Host -Prompt 'Vul hier het mailadres van de gebruiker in'
}


Remove-PSSession $Session