2017-10-21 15 views
1

나는 배제에 대한 배열을 사용하려면 :Powershell에서 배열이있는 항목 목록을 제외하고 Get-ChildItem을 사용하는 방법?

Remove-Item -Path "$InstallDir\Lang\*" -Exclude "de.txt", "en.txt" 

또는

Get-ChildItem "$InstallDir\Lang" -EXCLUDE "es.txt", "de.txt"| Remove-Item 

이 잘 작동 모두

.

Get-ChildItem "$InstallDir\Lang\*" -Exclude "$Language" | remove-item 

작동하지 않는 반면.

여러 가지 시도 (예 : How to use Get-ChildItem with filter array in Powershell? 또는 How to exclude list of items from Get-ChildItem result in powershell?)했지만 해결책을 찾지 못했습니다. $Language이 명령으로 해석 할 수없는 것처럼 보입니다.

이것은 $language가 구축하는 방법입니다

[string]$Language = @('"de.txt"') 
If ($PackageConfigFile.Language -notlike $Null) { 
    foreach ($LIP in $PackageConfigFile.Language) { 
     $Language += ",`n ""$LIP.txt""" 
    } 
} 

$ 언어, 예를 들어 있습니다 다음과 같은 내용

"de.txt"

"en.txt"

"es.txt"

아무도 생각 했습니까?

답변

0

첫째 :

실제 PowerShell을 배열로 $Language 인수를 구축; 시도한 것은 다중 행 문자열을 대신 생성합니다.

그 배열을 만들기만큼 간단해야 다음 LHS 같은 컬렉션 (어레이)와

-replace

$Language = $PackageConfigFile.Language -replace '$', '.txt' 
가 개별적 집합 내 각 아이템 동작; '$', '.txt' 효과적으로 각 입력 항목의 단부 ($)에.txt를 추가하고, 수정 결과 요소 .NET 타입 System.Object[]배열$Language에 수집된다.

둘째 :

"..."에, $Language, 배열 인수를 동봉하지 마십시오.만약 "..."에서 배열 변수 묶 경우

Get-ChildItem $InstallDir\Lang\* -Exclude $Language | Remove-Item -WhatIf 

는 PowerShell은 환경 변수 $OFS 값과 연결된 배열 요소들로 구성된 하나의 문자열로 변환 공간되는 디폴트; 예를 들면 : 유닉스/bash 배경에서 오는 독자

PS> $arr = 'a', 'b', 'c'; "[$arr]" 
[a b c] 

:

PowerShell에서 변수가 될 필요가 없습니다 따옴표 그들은, 다른 명령에 전달 할 때 어떤 사람들 (공백 또는 다른 셸 메타 문자)을 포함 할 수 있습니다.

PowerShell 네이티브 기능 (cmdlet, 함수, 스크립트)을 호출 할 때 변수의 원래 형식이 그대로 유지됩니다. .NET Framework의 리치 유형 시스템을 사용할 수있는 기능은 PowerShell의 진화 적 양자 도약을 보여주는 핵심 기능입니다. 껍질의 세계).

문자열을 명시 적으로 대상 명령에 전달하려는 경우에만 "..."을 사용하십시오.

1
$Language = @('de.txt') 
If ($PackageConfigFile.Language -notlike $Null) { 
    foreach ($LIP in $PackageConfigFile.Language) { 
     $Language += "$LIP.txt" 
    } 
}