Как получить последний объект времени записи, используя select-object в PowerShell? - PullRequest
0 голосов
/ 27 марта 2020

У меня есть какая-то папка, внутри папки есть файл и содержит идентификатор, затем мне нужно выбрать одну из папок по времени последней записи. Я пробовал таким образом

  Function Test
{ 
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true, Position = 0)]
        $Path,
        [Parameter(Mandatory = $true, Position = 2)]
        [string]$Pattern
    )

    $global:Result = '' | Select-Object @{Name = 'Exists'; Expression = {$false}}, FileName, Directory, @{Name = 'Attempts'; Expression = {1}}

    $file = Select-String -Path $Path -Pattern $Pattern -SimpleMatch -ErrorAction SilentlyContinue | Select-Object -First 1

    if ($file) {
        $file = Get-Item -Path $file.Path 

        $global:Result = [PSCustomObject]@{
            Exists    = $true
            FileName  = $file.FullName
            Directory = $file.DirectoryName
            Attempts  = 1
        }
    }
    else {
        Write-Host "Not Found"
    }
}


$ID = "8538"
$IDName = "ID_LST"
$Path = "D:\Folder\*\$IDName\"

Test -Path $Path -Pattern "$ID"
$global:Result | Format-List

В результате выбирается не папка, основанная на времени последней записи, а основанная на int имени папки.

Ответы [ 2 ]

1 голос
/ 28 марта 2020

Не должно быть необходимости использовать $global переменные, потому что функция просто выводит (массив) объектов.

Кроме того, я бы рекомендовал изменить имя функции в соответствии с соглашением Verb-Noun.

Примерно так должно работать:

function Test-Pattern { 
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true, Position = 0)]
        [string]$Path,
        [Parameter(Mandatory = $true, Position = 1)]
        [string]$Pattern
    )

    Get-ChildItem -Path $Path -Recurse -Filter '*.*' | ForEach-Object {
        if (Select-String -Path $_.FullName -Pattern $Pattern -SimpleMatch -ErrorAction SilentlyContinue) {
            [PSCustomObject]@{
                Exists        = $true
                FileName      = $_.FullName
                Directory     = $_.DirectoryName
                LastWriteTime = $_.LastWriteTime
                Attempts      = 1
            }
        }
        else {
            Write-Host "Pattern '$Pattern' not found in file $($_.FullName)"
        }
    }
}

$ID     = "8538"
$IDName = "ID_LST"
$Path   = "D:\Folder\*\$IDName"

# now use the function to find files that contain the pattern
# and capture the result in a variable.
$result = Test-Pattern -Path $Path -Pattern $ID

# output on screen
$result | Format-List

# output to csv file
$result | Export-Csv -Path 'D:\patternsearch.csv' -NoTypeInformation
0 голосов
/ 27 марта 2020

Если это не то, что вам нужно, пожалуйста, дайте мне знать. Я делаю все возможное, чтобы понять. Это не работает сейчас, но у меня есть несколько вопросов. Что находится в $ SSID? Ваша цель найти беспроводные SSID в папке?

Function Test
{ 
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true, Position = 0)]
        $Path,
        [Parameter(Mandatory = $true, Position = 1)] # Postion = 2 needs be Postion = 1
        [string]$Pattern
    )

    # It looks you are making an object twice.  You do not need this.  The PSCustomObject will do the job
    # $global:Result = '' | Select-Object @{Name = 'Exists'; Expression = {$false}}, FileName, Directory, @{Name = 'Attempts'; Expression = {1}}

    $file = Select-String -Path $Path -Pattern $Pattern -SimpleMatch -ErrorAction SilentlyContinue  # | Select-Object -First 1  # We will need more than one so we can sort it.

    if ($file) {

    Foreach ($f in $file) {  # Feed one object at a time to make your PSObject. 
        $myfile = Get-Item -Path $f.Path 

        $global:Result = [PSCustomObject]@{
            Exists    = $true
            FileName  = $myfile.FullName
            Directory = $myfile.DirectoryName
            LastWriteTime = $myfile.LastWritetime
            Attempts  = 1   # attempts will always equal 1 # I do not know what you are trying to do but, it will not break code.
            }
            $global:Result # output one object a time.
        }
    }
    else {
        Write-Host "Not Found"
    }
}

Test <# I help with the input to the fuction #> | Sort-Object -Property LastWriteTime


<#
$ID = "8538"
$IDName = "ID_LST"
$Path = "D:\Folder\*\$IDName\"

Test-FileWithGui -Path $Path -Pattern "$SSID"
$global:Result | Format-List
#>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...