Powershell脚本不会调用命令

时间:2014-02-10 04:32:48

标签: powershell scripting

我目前正在为课程分配工作,我们需要使用Dsadd命令将CSV用户列表导入Active Directory。

这是我的剧本:

$CSV = Import-Csv -Delimiter "," -Path "$PWD\TestCSV.csv"

foreach ($user in $CSV) 
{
    $Member = $User.Title + ","
    $Domain = $User.Domain + ", DC=Domains" + ", DC=com" + "`""
    $Name = $User.Firstname + " " + $User.Lastname + ","
    $Password = $User.Password
    write-host Dsadd user `"CN=$Name"" DC=$Domain -pwd $User.Password -memberof `"CN=$Member" CN=Users, DC=$Domain"
}

当我执行它时,它会将以下内容输出到powershell窗口:

Dsadd用户“CN = Abruaba Rodriguez,DC = CoolDomain,DC =域名,DC = Com”-pwd密码
-memberof“CN = gk_students,CN = Users,DC = CoolDomain,DC = Domains,DC = com”

这是添加具有该名称的用户的正确语法,就像我自己调用该行一样,它可以正常工作。但是如果我删除 write-host ,命令就会失败,说“dsadd failed:'DC = Domains,'是一个未知参数。

有什么建议吗?提前谢谢。

编辑:我让我的脚本通过一种解决方法,但我不认为这是运行此脚本的最佳方式。

我改变了最后一行,又增加了两行。我没有写入主机,而是写出变量,然后将输出放在一行上。然后我只是调用变量并成功!它起作用了:

$Execute = write-output Dsadd user `"CN=$Name"" DC=$Domain -pwd $User.Password -memberof     `"CN=$Member" CN=Users, DC=$Domain"
$Fields="{0} {1} {2} {3} {4} {5} {6} {7}" -f $Execute
Invoke-Expression $Fields

有没有更好的方法来使用PowerShell执行此任务?

1 个答案:

答案 0 :(得分:2)

我认为你的困难来自于Powershell如何解析传统命令的参数。由于您没有包含引号中包含空格的参数,因此Powershell不会认为它们是同一个字符串的一部分。它会将其作为单独的参数传递。

尝试以不同方式构建命令行

$CSV = Import-Csv -Delimiter "," -Path "$PWD\TestCSV.csv"

foreach ($user in $CSV) 
{
    $Domain = "DC={0},DC=Domains,DC=com" -f $User.Domain
    $MemberOfDn = """CN={0}, CN=Users,{1}""" -f $user.Title,$domain
    $UserDn = """CN={0} {1},{2}""" -f $User.Firstname, $User.Lastname, $Domain
    Dsadd user $UserDn -pwd $User.Password -memberof $MemberOfDn
}

通过这种方式,您可以在开头构建所需的所有字符串,并根据需要将它们组合在一起。此外,在双引号字符串中,""与转义的双引号字符相同,无论您喜欢哪种方式。您可以像我一样使用-f格式运算符,也可以像原始示例一样直接插入变量,但我发现格式运算符有助于整体可读性,特别是如果其他人必须维护/更改你的脚本。