2017-10-21 6 views
1

Ich möchte ein Array für den Ausschluss verwenden:Wie verwendet man Get-ChildItem mit Ausschluss einer Liste von Elementen mit einem Array in Powershell?

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

oder

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

Diese funktionieren beide gut.

Während

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

funktioniert nicht.

Ich versuchte mehrere Möglichkeiten (z. B. How to use Get-ChildItem with filter array in Powershell? oder How to exclude list of items from Get-ChildItem result in powershell?), aber ich kann keine Lösung finden. Es scheint, als ob $Language nicht mit dem Befehl interpretiert werden kann. Dies ist

wie $language wird gebaut:

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

$ Sprache hat z.B. der folgende Inhalt

"de.txt",

"en.txt",

"es.txt"

eine Idee Hat jemand?

Antwort

0

Erstens:

Bauen dein $Language Argument als einen tatsächlichen Powershell Array; Was Sie versucht haben, erstellt stattdessen eine mehrzeilige Zeichenfolge.

das Array anlegen sollte so einfach sein wie:

$Language = $PackageConfigFile.Language -replace '$', '.txt' 

-replace mit einer Sammlung (Array) als LHS, individuell in der Sammlung für jedes Element arbeitet; '$', '.txt' effektiv anhängt.txt zum Ende ($) jedes Eingabeelement, und das resultierende modifizierte Elemente werden in $Language als Array, von .NET-Typ System.Object[] gesammelt.

Zweitens:

Sie umschließen nicht $Language, Ihr Array Argument, in "...".

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

Wenn Sie ein Array Variable in "..." umschließen, konvertiert Power es auf einen einzelnen Zeichenfolge, mit dem Wert der Einstellungsvariablen bestehen Elemente des Arrays $OFS, verkettet die standardmäßig auf einen Raum; zB:

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

Für kommenden Leser von einem UNIX/bash Hintergrund:

Powershell-Variablen müssen in doppelten Anführungszeichen Seien Sie nicht, wenn sie an andere Befehle weitergegeben, was auch immer sie kann (Leerzeichen oder andere Shell-Metazeichen) enthalten. Wenn die PowerShell-native Funktionalität (Cmdlets, Funktionen, Skripts) aufgerufen wird, wird der ursprüngliche Typ der Variablen unverändert beibehalten (die Fähigkeit, das Rich-Type-System von .NET Framework zu verwenden, ist das Kernelement, das den evolutionären Quantensprung von PowerShell veranschaulicht) die Welt der Muscheln).

Verwenden Sie nur "...", wenn Sie explizit eine Zeichenfolge an den Zielbefehl übergeben möchten.

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