首页 > 解决方案 > 如何在PowerShell中循环匹配某个文件和一个字符串?

问题描述

我的文件夹中有一些文件,格式名称文件是这样的

US0908ABC
US0908DEF
US0908GHI

我想做循环来检查这些文件是否与我已经初始化的 2 个变量匹配。如果文件与我的变量匹配,它将返回匹配的文件。

这就是我所做的。我使用了这段代码,我可以将这些文件与我的变量匹配,但只检查 1 个变量,而不检查我的两个变量。

$Variable_1 = "US"
$Variable_2 = "0908"
$Path = "C:\Doc\File"
$SW = Get-ChildItem -Path $Path
if($SW -match $Variable_1 -and $Variable_2)
{   $SW
    Write-Host "Found"
}
else {
    Write-Host "Check Again!"
}

更新

Function Check
{
    $n = 0
    while (-not (Test-Path -Path $Path)) {
        Start-Sleep -s 5
        $n++
        Foreach($File in $SW) {
            If(($File.Name -match $Variable_1) -and ($File.Name -match $Variable_2)){
                Write-Host ">>file Found: $File"
            }
        }
    }
    Write-Host ">>File found after $n attempts"
    return $true
}

$Variable_1 = "US"
$Variable_2 = "0908"
$Path = "C:\Doc\File"
$SW = Get-ChildItem -Path $Path
If(Check)
{
    Write-Host ">>Found"
}
else {
    Write-Host "Not Found"
}

标签: powershell

解决方案


你可以去:

$Variable_1 = "US"
$Variable_2 = "0908"
$Path = "C:\Doc\File"
$SW = Get-ChildItem -Path $Path

$SW | ForEach-Object {
    if ($_.Name.Contains($Variable_1) -and $_.Name.Contains($Variable_2)) {   
        $_
        Write-Host "Found"
    }
    else {
        Write-Host "Check Again!"
    }
}

更简单的方法可以在一行中编码:

  $foundFiles = Get-ChildItem -Path "C:\Doc\File" | Where-Object {$_.Name.Contains("US") -and $_.Name.Contains("0908") }

$foundFiles是类型array并且包括所有过滤的文件。您可以$foundFiles通过for 循环foreach 循环或通过ForEach-Objectcmdlet 结合管道操作进行迭代(例如,$foundFiles | ForEach-Object { Write-Host "$_" }, where$_` 包括管道中的实际文件对象)。

如果要过滤文件结尾,可以将-Include参数添加到Get-ChildItem. 如果要在嵌套文件夹中查找文件,可以添加-Recurse开关。

因此,您的上述示例可以简化为一个 cmdlet 调用:

Get-ChildItem -Path "C:\Doc\File" -Include "*US*0908*" -Recurse

输出:

 Get-ChildItem -Path "C:\Doc\File" -Include "*US*0908*" -Recurse


 Directory: C:\Doc\File

  Mode                LastWriteTime         Length Name
  ----                -------------         ------ ----
  -a----        16.07.2019    07:27              0 US0908ABC
  -a----        16.07.2019    07:27              0 US0908DEF
  -a----        16.07.2019    07:28              0 US0908GHI

推荐阅读