2017-09-01 176 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