2017-10-21 3 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としてコレクション(アレイ)と、

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

-replace、個別にコレクション内の各項目に作用。 '$', '.txt'効果各入力項目の$)に.txtを付加し、得られた修飾された要素は、.NETタイプSystem.Object[]配列として$Languageに集められます。

第二:

"..."で、$Language、あなたの配列引数を囲まないでください。

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

もし"..."に配列変数を囲む場合、PowerShellはどの空間デフォルト設定変数$OFSの値と連結配列要素からなる単一ストリング、に変換;

PowerShellの変数がどのような彼ら、彼らは他のコマンドに渡されているときに、二重引用符で囲む必要はありません。例えば:UNIX/bash背景から来読者のために

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

(スペースやその他のシェルメタキャラクタ)が含まれている可能性があります。

PowerShellのネイティブ機能(コマンドレット、関数、スクリプト)を呼び出すと、変数の元の型はそのまま維持されます(.NET Frameworkのリッチ型システムを使用する機能は、PowerShellの進化的量子躍シェルの世界)。

文字列を明示的にターゲットコマンドに渡したい場合は、"..."を使用してください。

1
$Language = @('de.txt') 
If ($PackageConfigFile.Language -notlike $Null) { 
    foreach ($LIP in $PackageConfigFile.Language) { 
     $Language += "$LIP.txt" 
    } 
} 
関連する問題