2017-08-17 7 views
1

J'ai problème d'utilisation backtick (accent grave) pour l'expression de filtre multi-ligne dans PowerShell avec la commande Get-AdUser. Plus précisément je teste PowerShell 2.0 sur Windows 7.Backtick pour Get-ADUser filtre multi-ligne dans PowerShell

Un exemple de travail (filtre est sur une seule ligne):

Get-ADUser -Filter {Name -like "Smith*" -and Enabled -eq $True} 
# This works as expected, a list of matching objects is returned on pipeline 

Un exemple cassé (filtre est divisé en plusieurs lignes):

Get-ADUser -Filter {Name -like "Smith*" ` 
-and Enabled -eq $True} 
# Error message indicates "Operator not supported at position [of backtick] 

Un deuxième exemple cassé (filtre multi-ligne avec -et avant backtick):

Get-ADUser -Filter {Name -like "Smith*" -and ` 
Enabled -eq $True} 
#Error message indicates "Syntax error at position [of backtick]" 

Veuillez fournir des exemples de solutions de contournement ou expliquer la raison pour laquelle ces filtres multilignes ne sont pas pris en charge. J'ai du mal à trouver celui-ci, mais il semble que ce soit un type d'opération simple et courant dans PowerShell.

Répondre

2

Je suis sûr que quelqu'un de plus expérimenté peut aider avec celui-ci, mais le backtick ne semble pas être consommé par PowerShell pour cette ligne donc il se rend à l'analyseur filtre AD qui ne l'aime pas. Je n'ai rien trouvé dans about_ActiveDirectory_Filter qui expliquerait cela exactement. Backtick est toujours utilisé pour échapper les caractères. La nouvelle ligne est probablement passée à l'analyseur de filtres AD et elle ne l'aime pas.

La solution que je suis au courant de tout cela fonctionne est de construire votre scriptblock dans une variable avant la main et de passer à ce que Get-Aduser

$sb = { 
    Name -like "Matt*" -and 
    Enabled -eq $True 
} 
Get-ADUser -Filter $sb 
+0

Bonjour @Matt, cela m'a aidé à obtenir une solution de contournement acceptable. Je n'avais pas besoin de créer un bloc de script séparé. Il suffisait de terminer chaque ligne avec - et cela permet à l'analyseur d'en chercher plus (je pense?). Il ne me laissera pas mettre le code multi-ligne dans un commentaire - essayant de comprendre où le mettre ... –

0

Affichage exemple de code multi-ligne inspirée par @ réponse de Matt. Il suffisait de terminer chaque ligne avec -and (en supprimant les back-ticks). Le -et semble garder l'analyseur en chercher plus. Voilà un exemple de travail basé sur sa réponse:

Get-ADUser -Filter {Name -like "Smith*" -and 
Enabled -eq $True} 
# Works as expected, drop backtick and end each line with -and (or similar) 

Comportement étrange avec l'analyseur de bloc filtre et script, mais cette solution de contournement est acceptable pour moi. Pour confirmer cela semble être juste lié à l'option -Filter de la commande de dérangement, voir l'exemple suivant en utilisant la PowerShell droite avec le bloc de script (back-tick fonctionne sur plusieurs lignes d'échappement).

& {1 -eq 1 ` 
-and 2 -eq 2} 
# This works as expected, output is "True" 
+0

Je me sens bête maintenant puisque c'est juste comment fonctionne l'analyseur PowerShell basique. Surpris, il ne m'est jamais venu à l'esprit d'omettre le backtick car il n'est généralement pas nécessaire pour la plupart des commentaires sur plusieurs lignes. – Matt

+0

Cela m'a fait trébucher dans le passé et je ne m'en souviens plus alors maintenant nous l'avons pour l'éternité dans un post SOQA ;-). Merci de m'avoir aidé à résoudre ce problème! La prochaine fois que Google trouvera ce post pour moi, j'en suis sûr. –