我尝试使用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"
}
答案 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
}