首页 > 解决方案 > 需要修剪双扩展名文件的扩展名

问题描述

我有一些名称如下的文件,

输入可以是以下之一,

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

期待:

  1. 必须删除实际的文件扩展名,如下所示

$文件名=ABC.sample

$文件名=XYZ.sample

$文件名=123.sample

  1. 如果文件名中包含 .manifest。它必须修剪掉。

$trimed = XYZ.sample.tar.gz

标签: powershellpowershell-4.0

解决方案


您将遇到的主要问题是[IO.Path]::GetFileNameWithoutExtension($SURL)which 不支持多个扩展的概念。

通过为多个点扩展添加特殊考虑,这应该适合您。

在 中添加任何其他多个扩展(不包括清单扩展)$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 $_ }

结果 结果


推荐阅读