如何使用 Get-ChildItem 排除 Powershell 中带有数组的项目列表?

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

不起作用。

我尝试了几种方法(例如 How to use Get-ChildItem with filter array in Powershell? or 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"""
    }
}

$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' 有效地 appends .txt 到每个输入项的 end ($),结果修改后的元素作为 .NET 类型 System.Object[].

数组 收集在 $Language

第二:

不要将数组参数 $Language 包含在 "...".

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

如果您在 "..." 中包含一个数组变量,PowerShell 将其转换为单个 字符串 ,由数组元素与首选项变量 [= 的值连接而成23=],默认为 space;例如:

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

对于来自 UNIX / bash 背景的 读者:

PowerShell 变量在传递给其他命令时不需要用双引号引起来,无论它们可能包含什么(spaces 或其他shell元字符)。

调用 PowerShell 原生功能(cmdlet、函数、脚本)时,变量的原始类型将按原样保留(使用 .NET Framework 的丰富类型系统的能力是体现 PowerShell 进化飞跃的核心功能在 shells 的世界里)。

仅当您明确要将 字符串 传递给目标命令时才使用 "..."