如何使用 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 的世界里)。
仅当您明确要将 字符串 传递给目标命令时才使用 "..."
。
我想使用一个数组来排除:
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 的世界里)。
仅当您明确要将 字符串 传递给目标命令时才使用 "..."
。