需要修剪扩展名以获取双扩展名

时间:2019-05-27 13:56:29

标签: powershell powershell-v4.0

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

输入可以是以下内容之一,

  

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. 必须删除实际的文件扩展名,如下所示
  

$ filename = ABC.sample

     

$ filename = XYZ.sample

     

$ filename = 123.sample

  1. 如果文件名的文件名中带有.manifest。 它必须修剪掉。
  

$ trimed = XYZ.sample.tar.gz

1 个答案:

答案 0 :(得分:0)

您将遇到的主要问题是[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