2011-12-20 6 views
1

Powershellではかなり新しくなっていますが、VBScriptとPythonでは多くの経験があります。私はWindowsの管理者としてPowershellにもっと挑戦しようとしています。だから私がやろうとしていることは次のとおりです。 親フォルダには、ADユーザ名(例:Users \ username1、Users \ username2、Usersは親フォルダ)という名前のサブフォルダが数十含まれています。私は各フォルダ名をループし、サブフォルダ名を解析し、それをicaclsに渡してユーザ名に基づいてパーミッションを適用したいと思います。私は問題のパイピングに走っていたので、私はマルチライナーをしました。Powershell - パラメータにparanthesesが含まれている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"に変更しても機能しますが、問題のパラメータを使用して継承を設定する必要があります。助けてください。私はこの1日中、私の脳を一日中つづけています。本当に(など「$コマンド」として$コマンドを参照して、試してみましたバッククォート)を、特にこの問題に対処何かを見つけることができませんでした

ERROR:用語「OIは」の名前として認識されません コマンドレット、関数、スクリプトファイル、または実行可能なプログラムです。スペルを の名前で確認するか、パスが含まれている場合は、パスが正しいことを確認してから、もう一度やり直してください。ラインで :1つの文字:56 +はC ICACLS:\一時\テスト\のgarthwaitm /許可ドメイン\ USER1:(OI < < < <)(IO)F + CategoryInfo:ObjectNotFound:(OI:String)を[ ]、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" 

ところで、あなたは$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)"

関連する問題