【问题标题】:powershell - extract file name and extensionpowershell - 提取文件名和扩展名
【发布时间】:2012-04-05 00:28:37
【问题描述】:

我需要从中提取文件名和扩展名,例如我的.file.xlsx。我不知道文件或扩展名的名称,并且名称中可能有更多点,所以我需要从右侧搜索字符串,当我找到第一个点(或左侧最后一个点)时,提取部分从那个点开始的右侧和左侧的部分。

也许有更好的解决方案,但我在这里或其他任何地方都没有找到任何东西。谢谢

【问题讨论】:

    标签: .net powershell powershell-2.0


    【解决方案1】:

    如果文件从磁盘中取出并且正如其他人所说,请使用BaseNameExtension 属性:

    PS C:\> dir *.xlsx | select BaseName,Extension
    
    BaseName                                Extension
    --------                                ---------
    StackOverflow.com Test Config           .xlsx  
    

    如果给定文件名作为字符串的一部分(比如来自文本文件),我将使用 System.IO.Path 类中的 GetFileNameWithoutExtensionGetExtension 静态方法:

    PS C:\> [System.IO.Path]::GetFileNameWithoutExtension("Test Config.xlsx")
    Test Config
    PS H:\> [System.IO.Path]::GetExtension("Test Config.xlsx")
    .xlsx
    

    【讨论】:

    • System.IO.Path类中更多有用的方法不用参考MSDN文档,可以使用[System.IO.Path] | Get-Member -Static
    • 请注意,[System.IO.Path]::GetExtension 返回的扩展名包括句点(“.”)
    【解决方案2】:
    PS C:\Windows\System32\WindowsPowerShell\v1.0>split-path "H:\Documents\devops\tp-mkt-SPD-38.4.10.msi" -leaf
    tp-mkt-SPD-38.4.10.msi
    
    PS C:\Windows\System32\WindowsPowerShell\v1.0> $psversiontable
    
    Name                           Value
    ----                           -----
    CLRVersion                     2.0.50727.5477
    BuildVersion                   6.1.7601.17514
    PSVersion                      2.0
    WSManStackVersion              2.0
    PSCompatibleVersions           {1.0, 2.0}
    SerializationVersion           1.1.0.1
    PSRemotingProtocolVersion      2.1
    

    【讨论】:

    • 这显然不是答案
    【解决方案3】:

    去做吧:

    $file=Get-Item "C:\temp\file.htm"
    $file.Basename 
    $file.Extension
    

    【讨论】:

    • 我觉得应该是$file.Basename
    • 如果文件存在,这是理想的答案,否则你会得到一个ObjectNotFound 异常。
    【解决方案4】:

    如果来自文本文件并且假定名称文件被空格包围,这是一种方法:

    $a = get-content c:\myfile.txt
    
    $b = $a | select-string -pattern "\s.+\..{3,4}\s" | select -ExpandProperty matches | select -ExpandProperty value
    
    $b | % {"File name:{0} - Extension:{1}" -f $_.substring(0, $_.lastindexof('.')) , $_.substring($_.lastindexof('.'), ($_.length - $_.lastindexof('.'))) }
    

    如果是一个文件,你可以根据你的需要使用这样的东西:

    $a = dir .\my.file.xlsx # or $a = get-item c:\my.file.xlsx 
    
    $a
        Directory: Microsoft.PowerShell.Core\FileSystem::C:\ps
    
    
    Mode           LastWriteTime       Length Name
    ----           -------------       ------ ----
    -a---      25/01/10    11.51          624 my.file.xlsx
    
    
    $a.BaseName
    my.file
    $a.Extension
    .xlsx
    

    【讨论】:

      【解决方案5】:

      使用分割路径

      $filePath = "C:\PS\Test.Documents\myTestFile.txt";
      $fileName = (Split-Path -Path $filePath -Leaf).Split(".")[0];
      $extension = (Split-Path -Path $filePath -Leaf).Split(".")[1];
      

      【讨论】:

      • 请注意,这只有在文件名中没有句点时才有效。
      • 您可以更改为 Split(".")[-1] 以使其适用于名称中带有点的文件
      • @phuclv 此解决方案返回具有典型name.extension 格式的文件的扩展名。
      【解决方案6】:
      PS C:\Users\joshua> $file = New-Object System.IO.FileInfo('file.type')
      PS C:\Users\joshua> $file.BaseName, $file.Extension
      file
      .type
      

      【讨论】:

        【解决方案7】:

        检查 FileInfo 对象的 BaseName 和 Extension 属性。

        【讨论】:

        • 您有什么特别的信息吗?只需将文件传送到 Get-Member 即可显示所有成员;或浏览 MSDN 以查找官方帮助。
        【解决方案8】:

        从 PowerShell 6.0 开始,Split-Path 有一个 -Extenstion 参数。这意味着您可以:

        $path | Split-Path -Extension
        

        Split-Path -Path $path -Extension
        

        对于$path = "test.txt",两个版本都将返回.txt,包括句号。

        【讨论】:

          【解决方案9】:

          这是一个改编,如果有人好奇的话。我需要测试 RoboCopy 是否成功地将一个文件复制到多个服务器以确保其完整性:

             $Comp = get-content c:\myfile.txt
          
          ForEach ($PC in $Comp) {
              dir "\\$PC\Folder\Share\*.*" | Select-Object $_.BaseName
          }
          

          很好很简单,它显示了目录和其中的文件。如果您想指定一个文件名或扩展名,只需将 * 替换为您想要的任何内容。

              Directory: \\SERVER\Folder\Share
          
          Mode                LastWriteTime     Length Name                                                                                                                                             
          ----                -------------     ------ ----                                                                                                                                             
          -a---         2/27/2015   5:33 PM    1458935 Test.pptx                                                                                                             
          

          【讨论】:

            【解决方案10】:

            如果[System.IO.Path]::GetFileNameWithoutExtension() 难以输入或记住:

            ("file.name.ext.w..dots.ext" -split '\.' | select -SkipLast 1) -join '.'
            # >> file.name.ext.w..dots
            
            "file.name.ext.w..dots.ext" -split '\.' | select -Last 1
            # >> ext
            

            注意事项:

            -split 采用正则表达式(默认情况下),因此 . 必须转义

            我认为没有“语言环境”name.ext 文件名分隔符,是吗?

            -SkipLast 在 v5.0 中添加

            .NET 函数[System.IO.Path]::GetExtension() 返回扩展名包括 '.'字符;以上返回它没有

            我想,在不寻常的情况下,拆分后必须重新加入字符串可能会改变结果。或者,如果您对重新加入已经加入的字符串感到不舒服,可以:

            $file = "file.name.ext.w..dots.ext"
            $ext = $file -split '\.' | select -Last 1
            $name = $file.Substring(0, $file.LastIndexOf(".$ext"))
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2023-03-23
              • 1970-01-01
              • 2013-06-02
              • 1970-01-01
              • 2016-07-08
              • 2021-09-19
              • 2011-03-31
              • 2018-10-27
              相关资源
              最近更新 更多