2017-07-12 2 views
0

Je crée un script PowerShell pour créer Skype pour un compte d'utilisateur professionnel. J'essaye de trouver le nombre avaialble du dossier de CSV qui recherche le statut, l'unité d'affaires et l'emplacement pour trouver le LineUri correct à employer.Recherche et recherche de données CSV sur la base des critères

J'utilise le code suivant qui utilise toujours le premier numéro SPARE et ne valide pas l'emplacement et l'unité commerciale pour trouver la ligne uri.

$path  = Split-Path -parent $MyInvocation.MyCommand.Definition 
$newpath = $path + "\PhoneData.csv" 
$LineUri = @() 
$Status = @() 
$BusinessUnit = @() 
$Location = @() 

$csv = Import-Csv $newpath -Delimiter "," 

$csv |` 
    ForEach-Object { 
     $LineUri += $_.LineUri 
     $Status += $_.Status 
     $BusinessUnit +=$_.BusinessUnit 
     $Location +=$_.Location 
    } 

$currentStatus = "Spare" 
$userBusinessUnit = "Support" 
$userLocation = "WA" 


if ($Status -eq $currentStatus -And $BusinessUnit -eq $userBusinessUnit -And $Location -eq $userLocation) 
    {  
    $Where = [array]::IndexOf($Status, $currentStatus) 
    $AvailableURI = $LineUri[$Where]  
    #Write-Host "Next Uri Available: " $LineUri[$Where] 

    $changeWhere = [array]::IndexOf($LineUri, $AvailableURI) 
    #Write-Host "Next Uri Available: " $Status[$changeWhere] 


    Try 
    { 
     Enable-CsUser -identity sudip.sapkota -RegistrarPool "s4b-fe01.tapes.com" -SipAddressType SamAccountName -sipdomain "tapes.com" 
     Set-CsUser -Identity sudip.sapkota -EnterpriseVoiceEnabled $true -LineURI $AvailableURI 
     Grant-CsDialPlan -Identity sudip.sapkota -PolicyName 'DialPlan' 
     Grant-CsVoicePolicy -Identity sudip.sapkota -PolicyName 'My VoicePolicy' 

     Write-Host "[INFO]`t Lync Enterprise account for user sudip.sapkota has been created with sip : $AvailableURI" -ForegroundColor "Green" 
       "[INFO]`t Lync Enterprise account for user sudip.sapkota has been created with sip : $AvailableURI" | Out-File $log -append 

     $i = $changeWhere  
     $csv[$i].Status = 'Used' 

     $csv | Export-Csv -Path $newpath -NoTypeInformation 

     Write-Host "[INFO]`t PhoneData CSV has been updated" -ForegroundColor "Green" 
       "[INFO]`t PhoneData CSV has been updated" | Out-File $log -append 
    } 

    catch 
    { 
     Write-Host "[ERROR]`t Oops, something went wrong: $($_.Exception.Message)`r`n" -ForegroundColor "Red" 
        "[WARNING]`t Oops, something went wrong: $($_.Exception.Message)" | Out-File $log -append 
    } 

    } 

else 
{ 

    Enable-CsUser -identity sudip.sapkota -RegistrarPool "s4b-fe01.tapes.net" -SipAddressType SamAccountName -sipdomain "tapes.net" 
    Write-Host "[INFO]`t No Spare LineURI, user has been created as PC-to-PC only" -ForegroundColor "Yellow" 
      "[INFO]`t No Spare LineURI, user has been created as PC-to-PC only" | Out-File $log -append 
} 

Mon fichier CSV ressemble à ceci.

Name  LineUri      Status BusinessUnit Location 
Test 1  tel:+61396176100;ext=6100 Spare Sales   VIC 
Test 2  tel:+61396176101;ext=6101 Spare Sales   VIC 
Test 2  tel:+61396176102;ext=6102 Used Sales   NSW 
Test 2  tel:+61396176103;ext=6103 Spare Support   WA 
Test 2  tel:+61396176104;ext=6104 Spare Support   WA 
Test 2  tel:+61396176105;ext=6105 Used Action   VIC 
Test 2  tel:+61396176106;ext=6106 Spare Suppot   VIC 
Test 2  tel:+61396176107;ext=6107 Spare Action   VIC 

Quelqu'un peut-il m'aider à trouver mon erreur?

Comme je nourrissais manuellement l'entrée, l'entrée de test sont

$currentStatus = "Spare" 
$userBusinessUnit = "Support" 
$userLocation = "WA" 

donc je dois trouver le LineURI qui est SPARE, dont l'emplacement est WA et dont BusinessUnit est le soutien.

je devrais tél: 61396176103; ext = 6103 comme LineURI

+0

Quelle est votre sortie attendue? – gms0ulman

+0

@ gms0ulman J'ai mis à jour ma sortie dans la question elle-même –

Répondre

0

J'ai retravaillé votre logique un peu. J'ai senti que vous pouviez faire tout cela à l'intérieur de la boucle foreach. Pour plus de clarté, cela rassemble les données dans la boucle, puis vous laisse avec un tableau pour travailler. Vous pouvez simplement imbriquer vos actions dans la boucle directement et sortir ou vous pouvez le garder comme ceci et juste exécuter votre travail contre l'élément de tableau après.

# Array of spare numbers that meet your criteria 
$firstAvailableSpare 

# criteria 
$currentStatus = "Spare" 
$userBusinessUnit = "Support" 
$userLocation = "WA" 


$csv |` 
    ForEach-Object { 
     $LineUri += $_.LineUri 
     $Status += $_.Status 
     $BusinessUnit +=$_.BusinessUnit 
     $Location +=$_.Location 
    $currentStatus = "Spare" 
    $userBusinessUnit = "Support" 
    $userLocation = "WA" 


    if (($_.Status -eq $currentStatus) -And ($_.BusinessUnit -eq $userBusinessUnit) -And ($_.Location -eq $userLocation)) { 
     $firstAvailableSpare = $_ # Assign the first 
     $_.Status = "Used" 

     continue # break the loop so we don't get additional hits 

    } 
} 

$csv | Export-Csv -Path $newpath -NoTypeInformation 
$firstAvailableSpare # <-- your first available spare 
$firstAvailableSpare.LineUri # <-- the URI you want 

modifier 1: Mise à jour pour CSV exigence d'exportation

modifier 2: Changement de pause pour continuer. AVERTISSEMENT: Pour une raison quelconque, cela brise la fonctionnalité de débogage de l'ISE. Le pas s'arrêtera et les futurs points de rupture seront ignorés. Je ne sais pas pourquoi c'est mais c'est hors de portée pour votre objectif.

+0

Ceci est parfait, mais comment mettre à jour le fichier CSV de sorte que le statut peut être changé de SPARE à utilisé pour ce LineUri particulier .. –

+0

Réponse mise à jour avec exigence supplémentaire –

+0

il ne met pas à jour le fichier CSV .. –