簡體   English   中英

如何在 Powershell 中使用 Get-ChildItem 排除帶有數組的項目列表?

[英]How to use Get-ChildItem with excluding a list of items with an array in Powershell?

我想使用一個數組進行排除:

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

不起作用。

我嘗試了幾種方法(例如, 如何在 Powershell 中使用帶有過濾器數組的 Get-ChildItem?如何在 Powershell 中從 Get-ChildItem 結果中排除項目列表? )但我找不到解決方案。 似乎$Language不能被命令解釋。

這就是$language的構建方式:

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

$language 有例如以下內容

"de.txt",

"en.txt",

“es.txt”

有人有想法嗎?

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

第一的:

將您的$Language參數構建為實際的PowerShell 數組 您嘗試創建的是一個多行字符串

創建該數組應該很簡單:

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

-replace ,以集合(數組)為 LHS,分別對集合中的每一項進行操作; '$', '.txt'有效地.txt附加到每個輸入項的末尾( $ ),並將生成的修改元素作為 .NET 類型System.Object[]數組收集在$Language中。

第二:

不要將數組參數$Language括在"..."

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

如果將數組變量括在"..." ,PowerShell 會將其轉換為單個字符串,該字符串由數組元素與首選項變量$OFS的值連接而成,默認為空格 例如:

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

對於來自 UNIX/ bash背景的讀者

PowerShell 變量在傳遞給其他命令時不需要雙引號,無論它們可能包含什么(空格或其他 shell 元字符)。

調用 PowerShell 原生功能(cmdlet、函數、腳本)時,變量的原始類型按原樣保留(使用 .NET Framework 的豐富類型系統的能力是核心功能,體現了 PowerShell 在 shell 世界中的演進性飛躍)。

如果您明確希望將字符串傳遞給目標命令,則僅使用"..."

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM