2016-10-05 5 views
1

Wenn ich den folgenden Code ausführen, bekomme ich das folgende Ergebnis.Keine Ausgabe bei Wildcard-Suche angezeigt

import-module activedirectory 
Get-ADComputer -Filter {Name -Like "*1234*"} -Property * | Format-Table Name,OperatingSystem,OperatingSystemServicePack -Wrap -Auto 

Name  OperatingSystem  OperatingSystemServicePack 
----  ---------------  -------------------------- 
DEP12345LT             
CLC41234DT Windows 7 Enterprise Service Pack 1    
A123456 Windows 7 Enterprise Service Pack 1  

Aber wenn ich diesen Code ausführen

import-module activedirectory 
$assetid = Read-Host "Assest id" 
Get-ADComputer -Filter {Name -Like "*$assetid*"} -Property * | Format-Table Name,OperatingSystem,OperatingSystemServicePack -Wrap -Auto 

ich

PS U:\> V:\General Helpful Scripts and Code\wild_card_pc_number_finder.ps1 
Assest id: 1234 

PS U:\> 

Warum ist es nicht die Ergebnisse anzeigt, wenn versuchen, eine Variable zu übergeben?

Antwort

1

Es sieht aus wie -Filter Parameter bewertet nicht die Zeichenfolge "*$assetid*" richtig. Wenn Sie die Zeichenfolge zuerst in einer anderen Variablen erstellen und dann verwenden, funktioniert sie.

Import-Module activedirectory 
$assetid = Read-Host "Assest id" 
$like = "*$assetid*" 
Get-ADComputer -Filter {Name -Like $like} -Property * | Format-Table Name,OperatingSystem,OperatingSystemServicePack -Wrap -Auto 

Ein anderer Weg, um dies ist eine Zeichenkette in PowerShell Expression Language Syntax für die -Filter Parameter (more info) zu verwenden, erstellen.

-Filter "Name -like '*$assetid*'" 

Von dem, was ich kann den Grund unter stehen, warum dies nicht funktioniert, ist, dass PowerShell versucht ist {Name -Like "*$assetid*"} in PowerShell Expression Language Syntax umwandelt, die im Grunde eine Zeichenfolge ist, so dass Sie werden Sie so etwas wie dies nach der Umwandlung enden wird.

'Name -Like "*$assetid*"' 

Bedeutung Sie für *$assetid* und nicht den Wert der Variablen suchen.

Deshalb können Sie das zweite Beispiel verwenden, das ich zur Verfügung gestellt habe. Als PowerShell wird die Zeichenkette ausgewertet, bevor sie an den Parameter übergeben wurde. Während die von Ihnen verwendete Methode einen Skriptblock { .. } weitergibt, versucht das Cmdlet, es in die PS Expression Language-Syntax zu konvertieren.

+0

Cool! Es funktionierte! Gibt es einen Grund, warum es das nicht beurteilen kann? und warum ich die Zeichenfolge vorher erstellen und übergeben muss. – TuckRollworthy

+0

@TuckRollworthy Ich habe meine Antwort aktualisiert und versucht zu erklären, warum das nicht funktioniert. – Richard