2017-09-01 178 views
0

我正在嘗試使用csv文件在活動目錄中創建帳戶的腳本。不幸的是,我是通用的PowerShell和腳本編程的新手,並且面臨着難以管理一個foreach()循環的問題,該循環旨在處理導入的csv文檔中的每個列。Powershell Foreach的用法和語法

我懷疑我不能在foreach()之後的一個塊中定義我的變量,但我不確定,並且希望得到一些指導。具體而言,代碼的目的是讀取一個csv文檔,並將每個項目分配給一個變量,然後使用該變量創建具有這些值的服務帳戶。

理想的情況是我可以用幾百行創建csv,執行腳本並以幾百個匹配的服務帳戶結束。

$SVC = (import-csv C:\users\me\desktop\Test.csv -header("Name", "Pass", "WhatDo", "Location", "Domain")) ` 
foreach($variable in %SVC) { 

    $name = $SVC.Name 
    $Pass = $SVC.Pass 
    $WhatDo = $SVC.WhatDo 
    $Location = $SVC.Location 
    $Domain = $SVC.Domain 


     New-ADuser ` 
      -Name $name ` 
      -AccountPassword (Convertto-SecureString $Pass -AsPlainText -Force) ` 
      -CannotChangePassword $true ` 
      -Description $WhatDo ` 
      -DisplayName $name ` 
      -Enabled $true ` 
      -GivenName $name ` 
      -PasswordNeverExpires $True ` 
      -Office $Location ` 
      -Path "OU=Service-Accounts, Ou=Accunts, OU=_CORP, DC=$Domain, DC=net" ` 
      -SamAccountName $name ` 
      -UserPrincipleName $name + "@" + $domain + ".net" ` 

     Start-Sleep -Seconds 15 

    Get-ADUser ` 
     -Identity $name | Add-ADPrincipalGroupMembership ` 
     -MemberOf "Group1","Group2","Group3" 

    } 
+0

請描述您遇到的問題 - 否則您的問題可能會面臨關閉:尋求調試幫助的問題(「爲什麼不是這個代碼工作?」)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現它所需的最短代碼。沒有明確問題陳述的問題對其他讀者無益。請參閱:[如何創建最小的,可驗證的示例](https://stackoverflow.com/help/mcve)。祝你好運! – theFunkyEngineer

+0

'foreach($ item in $ SVC)' - 但是有許多許多在線exmaples用於從csv,excel,txt等創建AD用戶... – Clijsters

回答

0

重命名$SVC$SVCs然後foreach ($SVC in $SVCs)

0

下面是一個例子,你如何能做到這一點。(不要忘了分隔符)

$csv = Import-Csv -Path C:\temp\csv.csv -Header "a","b","c" -Delimiter ";" 
foreach($row in $csv){ 
    $row.a 
    $row.b 
    $row.c 
} 

下面是更多的例子是如何工作的foreach : 看一看https://ss64.com/ps/foreach.html

Examples 

Loop through an array of strings: 

$trees = @("Alder","Ash","Birch","Cedar","Chestnut","Elm") 

foreach ($tree in $trees) { 
    "$tree = " + $tree.length 
} 

Loop through a collection of the numbers, echo each number unless the number is 2: 

foreach ($num in 1,2,3,4,5) { 
    if ($num -eq 2) { continue } ; $num 
} 

Loop through a collection of .txt files: 

    foreach ($file in get-ChildItem *.txt) { 
    Echo $file.name 
    } 
1

你的代碼有很多錯誤,而不僅僅是foreach。

但是,讓我們開始認爲:foreach ($variable in $SVC)意味着$variable將有當前項目的環內,但你正在訪問在循環$SVC這仍然是指原始集合。 $variable也不是一個好名字,所以你應該把它改爲更有意義的東西。此外,你寫了%SVC而不是$SVC

你也反覆使用(`)很多,有時不正確。您應該只在您的cmdlet調用跨越多行時使用它。在Import-Csv的情況下,它不是,但最後還是會有反撥。最後一行New-ADUser也有一個。有些人傾向於使用Parameter Splatting而不是反引號,但這就是品味的問題。

考慮要創建服務帳戶,我會寫的第一部分是這樣的:

$serviceAccounts = Import-Csv C:\users\me\desktop\Test.csv -Header Name,Pass,WhatDo,Location,Domain 

foreach($serviceAccount in $serviceAccounts) { 

那麼你的循環中,你可以通過$serviceAccount訪問蹦牀網上單屬性:

$name = $serviceAccount.Name 

而且,PowerShell的當使用雙引號時擴展了變量,所以-UserPrincipleName可以這樣寫:-UserPrincipleName "[email protected]$domain.net"

+0

我對腳本非常陌生,並且感謝每一位幫助。感謝您的評論,因爲它允許我立即取得進展,並幫助我更快地掌握自己正在做的事情的性質。 – Yamez

1

我更喜歡使用ForEach-Object而不是foreach。

這將是這樣的:

$SVC = (Import-CSV C:\users\me\desktop\Test.csv -header("Name", "Pass", "WhatDo", "Location", "Domain")) 
$SVC | ForEach-Object { 

     New-ADuser ` 
      -Name $_.Name ` 
      -AccountPassword (Convertto-SecureString $_.Pass -AsPlainText -Force) ` 
      -CannotChangePassword $true ` 
      -Description $_.WhatDo ` 
      -DisplayName $_.Name ` 
      -Enabled $true ` 
      -GivenName $_.Name ` 
      -PasswordNeverExpires $True ` 
      -Office $_.Location ` 
      -Path "OU=Service-Accounts, Ou=Accunts, OU=_CORP, DC=$Domain, DC=net" ` 
      -SamAccountName $_.Name ` 
      -UserPrincipleName $_.Name + "@" + $_.Domain + ".net" 

     Start-Sleep -Seconds 15 

    Get-ADUser ` 
     -Identity $_.Name | Add-ADPrincipalGroupMembership ` 
     -MemberOf "Group1","Group2","Group3" 

    } 

$ _代表在管道中的當前項目。 (在你的情況下,$ SVC是錯誤的變量)。它代碼更少,我認爲這是一種更乾淨的做事方式!

+0

謝謝你的建議。我需要我能得到的所有幫助,而你的回答讓我知道自己出錯的地方。乾杯。 – Yamez