Powershell Foreach用法和语法

时间:2017-09-01 12:50:39

标签: powershell csv variables foreach

我尝试使用csv文件编写在活动目录中创建帐户的脚本。不幸的是,我不熟悉PowerShell和脚本,并且在管理foreach()循环时遇到了困难,该循环用于处理我导入的csv文档中的每个列。

我怀疑我不能像我一样在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"  

    }

4 个答案:

答案 0 :(得分:1)

您的代码中存在许多错误,而不仅仅是foreach。

但是,让我们开始吧:public class ErrorController : Controller { public ActionResult Handler(HttpException exception) { Response.ContentType = "text/html"; if (exception != null) { Response.StatusCode = exception.GetHttpCode(); Response.StatusDescription = exception.Message; ViewBag.StatusString = (HttpStatusCode)exception.GetHttpCode(); return View("Handler", exception); } return View("Internal"); } } 表示foreach ($variable in $SVC)将包含循环中的当前项,但您仍然在循环中访问$variable指的是原始的收藏品。 $SVC也不是一个好名字,所以你应该把它改成更有意义的东西。另外,您写了$variable而不是%SVC

你也经常使用反引号(`),有时不正确。只应在cmdlet调用跨越多行时使用它。在$SVC的情况下,它不是,但最后还有反击。 Import-Csv的最后一行也有一个。有些人更喜欢使用Parameter Splatting而不是反叛,但这只是一种品味问题。

考虑到你正在创建服务帐户,我会写第一部分:

New-ADUser

然后在循环中,您可以通过$serviceAccounts = Import-Csv C:\users\me\desktop\Test.csv -Header Name,Pass,WhatDo,Location,Domain foreach($serviceAccount in $serviceAccounts) {

访问单个属性
$serviceAccount

此外,PowerShell在使用双引号时会扩展变量,因此$name = $serviceAccount.Name 可以这样写:-UserPrincipleName

答案 1 :(得分:1)

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

这将是:

files = [tuple(x[-10:], y) for x, y in files]

$ _表示管道中的当前项目。 (在你的情况下是$ SVC,这是一个错误的变量。)它的代码更少,我认为它是一种更干净的做事方式!

答案 2 :(得分:0)

$SVC重命名为$SVCs,然后重命名为foreach ($SVC in $SVCs)

答案 3 :(得分: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
  }