2011-12-20 2 views
1

저는 PowerShell을 처음 접했지만 VBScript와 Python에서 많은 경험을했습니다. 좋은 Windows 관리자가되고 Powershell에 더 많이 들어가려고 노력 중입니다. 그래서, 여기 내가 뭘하려고하는지 : 상위 폴더에는 AD 사용자 이름 (예 : Users \ username1, Users \ username2, Users는 상위 폴더)이라는 이름의 수십 개의 하위 폴더가 있습니다. 각 폴더 이름을 반복하고 하위 폴더 이름을 구문 분석하여 icacls에 전달하여 사용자 이름을 기반으로 권한을 적용합니다. 내가 파이핑 문제를 겪고 있었기 때문에 나는 다중 라이너를 만들었다.Powershell - 매개 변수에 포함 된 괄호로 icacls 호출

$root_folder = "c:\temp\test" 
$cmd1 = "icacls " 
$cmd2 = " /grant cm\" 
$cmd3 = ":`(OI`)`(CI`)F" 
$paths_collection = get-childitem $root_folder | foreach-object -process {$_.FullName} 
foreach ($path in $paths_collection) 
{$string = $path.split("\");$last = $string[-1];$command = $cmd1 + $path +$cmd2 +$last +$cmd3;invoke-expression $command} 

그것은 원래이 거친 아니었지만, 나는 문제에 실행되었을 때 떨어져을 깨는 시작 : 이것은 여러 가지 방법을 시도 후 내가 가진 것입니다.

문제 - $ cmd3에서 (OI) (CI)가 invoke-expression에 완전히 들어 가지 않습니다. $ cmd3을 ": F"로 변경하면 문제가 발생하지만 문제가되는 매개 변수를 사용하여 상속을 설정해야합니다. 도와주세요. 나는이 하루 종일 내 머리를 고문 해왔다. 정말 (등 '$ 명령'으로 $ 명령을 참조 시도 역 따옴표)를 구체적으로이 문제를 처리 아무것도 찾을 수 없습니다

ERROR : 용어 'OI는'의 이름으로 인식되지 않습니다 cmdlet, 함수, 스크립트 파일 또는 작동 가능한 프로그램 이름의 맞춤법 검사 을 확인하거나 경로가 포함되어 있으면 경로가 올바른지 확인하고 다시 시도하십시오. 라인에서 1 개 문자 : 56 +는 C ICACLS : \ 임시 \ 테스트 \의 garthwaitm/허가 도메인 \ user1의 (OI < < < <) (IO) F + CategoryInfo : ObjectNotFound (OI : 문자열) ], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException

+0

문자열 연결은 여기에있는 것보다 훨씬 쉽습니다. '$ command = "$ cmd1 $ path $ cmd2 $ last $ cmd3' 그리고 나서 그것을 실행하여 실행중인 것을 볼 수 있습니다. 그 변수를 그냥 써내려한다면 출력은 어떻게 되나요? – JNK

+0

제가 그랬습니다. 문자열을 올바르게.그러나 Invoke-Expression이 호출되면 올바르게 구문 분석되지 않습니다 (필자는 믿는다). 나는 bobbymcr이 그것을 아래에 가지고 있다고 생각한다. 그래도 고마워! –

답변

2

불필요하게 복잡하게 생각합니다.

echoargs.exePowershell Community Extensions에서 가져 오십시오.

PS >.\EchoArgs.exe /grant $path "cm\$last" ":(OI)(CI)F" 
Arg 0 is </grant> 
Arg 1 is <c:\test> 
Arg 2 is <cm\user> 
Arg 3 is <:(OI)(CI)F> 

다음 원하는 명령을 호출 : 다음과 같은 일이 당신이 원하는 어떤 경우

는 참조

&icacls /grant $path "cm\$last" ":(OI)(CI)F" 

BTW, 당신은 $last를 얻을 수 Split-Path를 사용할 수 있습니다. 그리고 그냥 당신이 지금 사용할 수있는 PowerShell을 3.0에서,이 오래된 질문에 추가하는 대신 foreach-object -process {$_.FullName}

+0

와우, 이것은 모두 훌륭한 정보입니다. 감사합니다 manojlds! 내가 말했듯이, Powershell에 익숙해 지려고 정말로 노력합니다. 절대로 EchoArgs.exe에 대해 들어 보지도 않았습니다. –

+0

@MattG. 외부 앱을 다운로드하지 않으려면 'args'요소를 출력하는 콘솔 애플리케이션을 작성할 수 있습니다. – mjsr

2

select -expand fullname을 사용 -이 같은 것을 사용할 수 있도록, 라인에 다른 어떤 처리를 중지 할 PowerShell을 알려 %를 :

icacls.exe $path --% /grant "Everyone:(OI)(CI)(F)"

관련 문제