2014-02-10 2 views
0

현재 CSV 사용자 목록을 Active Directory로 가져 오기 위해 Dsadd 명령을 사용해야하는 클래스에 대한 할당 작업을하고 있습니다. ,Powershell 스크립트가 명령을 호출하지 않습니다.

하는 dsadd 사용자 "CN = Abruaba로드 리 게스, DC = CoolDomain, DC = 도메인 : 나는 그것을 실행하면

$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 창에 다음을 인쇄합니다

이 내 스크립트입니다 DC = 컴 CN = gk_students "-memberof -pwd 암호
는"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 = 사용자, {1} "" "대신 CN = {0}, CN = 사용자, {1}" ' –

관련 문제