2014-02-10 108 views
0

我目前正在为类进行分配,我们需要使用Dsadd命令将CSV用户列表导入到Active Directory中。Powershell脚本不会调用命令

这是我的脚本:

$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罗德里格斯,DC = CoolDomain,DC =域, DC = com”的-pwd密码
-memberof “CN = gk_students,CN =用户,DC = CoolDomain,DC =域,DC = com的”

这是正确的语法来添加用户使用该名称,如如果我自己调用该行,它就可以工作。但是,如果我删除写主机命令失败说“DSADD失败:‘DC =域’是未知参数

任何意见,在此先感谢

编辑:?我有我的脚本通过一个解决方法工作,但我不认为这是这个脚本可以运行的最佳方式

我改变了最后一行,并添加了两个,而不是写入主机,我写了一个变量,然后然后我简单地调用变量并成功!它的工作原理如下:

$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来完成这项任务?

回答

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格式运算符,也可以像直接插入变量一样,但我发现格式运算符有助于提高整体可读性,尤其是在其他人必须维护/更改脚本时。

+0

谢谢,这使得更多的意义。我从来不知道格式运算符存在。 – user3291398

+0

如果您使用'-f'格式化字符串,为什么不使用单引号并避免多余的''''转义?例如。 CN = {0},CN = Users,{1}“''而不是'”“”CN = {0},CN = Users,{1}“”“'。 –