Icacls d'appel Powershell avec paranthèses inclus dans les paramètres

Je suis assez nouveau à Powershell, mais j'ai beaucoup d'expérience en VBScript et Python. J'essaie d'être un bon administrateur Windows et entrer dans Powershell plus. Voici donc ce que j'essaie de faire: Un dossier parent contient des douzaines de sous-dossiers qui sont nommés comme noms D'utilisateurs AD (ex. Usersusername1, Usersusername2, où Users est le dossier parent). Je veux faire une boucle à travers chaque nom de dossier, analyser le nom du sous-dossier, et passer à icacls pour appliquer des permissions basées sur le nom d'utilisateur. J'ai fait une multi-doublure parce que je rencontrais des problèmes de tuyauterie. C'est ce que j'ai après avoir essayé plusieurs approches différentes:

$root_folder = "c:temptest"
$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}

ce n'était pas si dur à l'origine, mais j'ai commencé à le briser quand j'ai eu des problèmes.

le problème - en $cmd3, le (OI)(CI) ne vient pas proprement à l'expression invoke. Si je change $ cmd3 pour juste ":F " cela fonctionne, mais je dois mettre l'héritage en utilisant le paramètre. S'IL VOUS PLAÎT AIDER. J'ai cassé mon cerveau toute la journée sur celui-ci. Je n'ai pas vraiment trouvé quoi que ce soit qui ait traité spécifiquement de cette question (j'ai essayé des Rétro-repères, référencement de la commande $en tant que '$command', etc.)

erreur: Le terme " OI " n'est pas reconnu comme le nom d'un cmdlet, d'une fonction, d'un fichier script ou d'un programme opérable. Vérifiez l'orthographe du nom, ou si un chemin a été inclus, vérifiez que le chemin est correct et réessayez. À la ligne:1 char:56 + icacls C:temptestgarthwaitm /subvention domaineuser1 :(OI <<<< )(IO)F + CategoryInfo: ObjectNotFound: (OI:String) [], CommandNotFoundException + FullyQualifiedErrorId: CommandNotFoundException

1
demandé sur Matt G. 2011-12-21 00:25:00

3 réponses

je pense que vous le compliquez inutilement.

Get echoargs.exe à partir de Powershell Communauté Extensions .

voir si quelque chose comme ci-dessous est ce que vous vouliez:

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>

alors appelez - le avec la commande que vous voulez:

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

BTW, vous pouvez utiliser Split-Path pour obtenir le $last . Et utilisez select -expand fullname au lieu de foreach-object -process {$_.FullName}

2
répondu manojlds 2011-12-20 21:01:24

juste pour ajouter à cette vieille question, dans PowerShell 3.0 vous pouvez maintenant utiliser --% pour dire à PowerShell d'arrêter de traiter quoi que ce soit d'autre sur la ligne, de sorte que vous pouvez utiliser quelque chose comme ceci:

icacls.exe $path --% /subvention "tout le monde:(OI)(CI)(F)"

2
répondu Daniel Morritt 2014-07-21 15:02:26

avez-vous essayé d'utiliser des citations autour de $command , par exemple Invoke-Expression "$command" ? D'autres techniques pour empêcher les parenthèses d'être traitées sont discutées ici: http://msdn.microsoft.com/en-us/library/cc281841.aspx

0
répondu bobbymcr 2011-12-20 20:36:00