无法在powershell中获得-contains以达到预期的效果

时间:2014-07-19 19:11:04

标签: arrays powershell contains

我正在尝试在Powershell中编写一个匹配文件名扩展名的脚本。这就是我到目前为止所做的:

$location = $args[0];

[String]$extensions = @(".mkv", ".mp4", ".avi", ".wmv");
$pruneSize = 41240000;

Set-Location $location;

Get-ChildItem -Recurse | ForEach-Object {
    If($extensions -contains $_.Extension) {
        Write-Host "Found it";
    }
    else {
        Write-Host $_.Extension not found in $extensions;
    }
}

这是输出:

.mp4 not found in .mkv .mp4 .avi .wmv
.bat not found in .mkv .mp4 .avi .wmv
.bat not found in .mkv .mp4 .avi .wmv

所以它似乎应该有效,但事实并非如此。如果我将“-contains”切换为“-match”然后它可以工作,虽然我不想使用匹配,因为看起来-contains应该是我真正想要的,并且对于我需要的更准确。我错过了一些PowerShell的怪癖吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

尝试从[String]

之前删除$extensions

答案 1 :(得分:2)

您的问题是您要将数组转换为String(多个对象 - >一个对象)。这将扩展连接在一起,每个项目之间有一个空格。

[String]$extensions = @(".mkv", ".mp4", ".avi", ".wmv");

$extensions
.mkv .mp4 .avi .wmv

-contains用于查找数组中的项。所以把演员放到弦上,一切都会好的。

$extensions = @(".mkv", ".mp4", ".avi", ".wmv");

$extensions -contains ".mp4"
True