Необходимо обрезать расширение для двойного расширения имени файла - PullRequest
0 голосов
/ 27 мая 2019

У меня есть несколько файлов с именами, как показано ниже,

Ввод может быть одним из следующих,

ABC.sample.tar.gz

XYZ.sample.tar.gz.Manifest

123.sample.zip

У меня есть пара требований

  1. Необходимо полностью обрезать расширение и сохранить имя файла без расширения в переменной.

Пример вывода: $ filename = ABC.sample или XYZ.sample или 123.sample

  1. Необходимо обрезать только ".manifest", если он существует и сохраняется в другой переменной.

Код:

$SURL = "ABC.sample.tar.gz.manifest"
$UDRname = [IO.Path]::GetFileNameWithoutExtension($SURL)
$UDRname

Выход: ABC.sample.tar.gz

Expectation:

  1. Фактические расширения файлов должны быть удалены, как показано ниже

$ filename = ABC.sample

$ имя_файла = XYZ.sample

$ имя_файла = 123.sample

  1. Если имя файла имеет .manifest в имени файла. Это должно быть урезано.

$ trimed = XYZ.sample.tar.gz

1 Ответ

0 голосов
/ 27 мая 2019

Основная проблема, с которой вы столкнетесь, - [IO.Path]::GetFileNameWithoutExtension($SURL), которая не поддерживает концепцию нескольких расширений.

Добавив особое внимание для нескольких точек расширения, Вот то, что должно работать для вас.

Добавьте любые другие множественные расширения (за исключением манифеста) в $DoubleExtensions, чтобы охватить другие возможные случаи.

Учтите следующее:

Function Get-FileInfos($FullName) {
    $DoubleExtensions = @('.tar.gz')
    $Manifestext = '.manifest'
    $IsManifest = $FullName.EndsWith($Manifestext)
    $Extension, $TrimmedName = $null    
    $NameToProcess = $FullName

    # Process manifest extention
    if ($IsManifest) {
        $TrimmedName = [IO.Path]::GetFileNameWithoutExtension($FullName)
        $NameToProcess = $TrimmedName
    }

    # Process double extensions
    Foreach ($Ext in $DoubleExtensions) {
        if ($NameToProcess.EndsWith($Ext)) {
            if ($IsManifest -eq $false) {
                $Extension = $Ext
                $ShortName = $NameToProcess.Substring(0, $NameToProcess.Length - $ext.Length)
            }
            else {
                $Extension = $Ext
                $ShortName = $NameToProcess
            }
            break 
        }
    }

    # Process normal extensions 
    if ($null -eq $Extension ) {

        if ($IsManifest -eq $false) {
            $Extension = [io.Path]::GetExtension($NameToProcess)
            $ShortName = [IO.Path]::GetFileNameWithoutExtension($NameToProcess)
        }
        else {
            $ShortName = $NameToProcess
        }

    }

    # If manifest, extension should be .manifest without original file extension
    if ($IsManifest) { $Extension = $Manifestext }

    return [PSCustomObject]@{
        FullName    = $FullName
        TrimmedName = $TrimmedName
        ShortName   = $ShortName
        Extension   = $Extension
    }
}

Образец теста

$TestList = @(
    'ABC.sample.tar.gz.manifest'
    'DEF.sample.tar.gz'
    'GHI.Sample.manifest'
    'JKL.exe'
)

$TestList | foreach { Get-FileInfos -FullName $_ }

Результат Results

...