2016-10-05 2 views
1

아래 코드를 실행하면 다음과 같은 결과가 나타납니다. 이 코드를 실행하면와일드 카드 검색에서 출력을 표시하지 않습니다.

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  

는 그러나

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

나는

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

PS U:\> 

시도 변수를 전달할 때 왜 결과를 표시하지 않습니다를 얻을?

답변

1

-Filter 매개 변수가 "*$assetid*" 문자열을 올바르게 평가하지 않습니다. 먼저 다른 변수에 문자열을 작성한 다음 사용하면 작동합니다. 이 약

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

또 다른 방법은 -Filter 매개 변수 (more info)에 대한 PowerShell Expression Language Syntax에서 문자열을 만들 사용하는 것입니다. 나는 아래이 작동하지 않는 이유를 참을 수있는 일부터

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

PowerShell 당신이 끝날 수 있도록 문자열은 기본적으로 어떤 PowerShell Expression Language Syntax{Name -Like "*$assetid*"} 변환하는 시도는 것을 당신이 의지로 변환 한 후이 같은.

'Name -Like "*$assetid*"' 

당신은 변수의 값을 *$assetid* 검색하고 있지 않습니다 의미.

왜 내가 제공 한 두 번째 예를 사용할 수 있습니다. PowerShell은 문자열을 매개 변수로 전달하기 전에 문자열을 평가합니다. 사용중인 메서드가 { .. } 스크립트 블록을 전달하는 반면 cmdlet은 PS 식 언어 구문으로 변환하려고 시도합니다.

+0

쿨! 그것은 효과가있다! 그걸 평가할 수없는 이유가 있을까요? 왜 내가 먼저 문자열을 생성하고 그것을 전달해야하는지. – TuckRollworthy

+0

@TuckRollworthy 내 답변을 업데이트하고 이것이 작동하지 않는 이유를 설명하려고했습니다. – Richard