【问题标题】:powershell filter to remove .pdf extension in the name of a filepowershell 过滤器以删除文件名中的 .pdf 扩展名
【发布时间】:2015-05-15 06:44:44
【问题描述】:

我正在尝试使用 powershell 来获取文件夹中的所有子元素,我使用的代码是

Get-ChildItem -Recurse -path C:\clntfiles

这段代码给出的输出类似于

Mode                LastWriteTime     Length Name                                                                      
----                -------------     ------ ----                                                                      
-a---         4/29/2015   9:11 AM    6919044 HD 100616 Dec2014.pdf  
-a---          5/1/2015  11:42 AM    7091019 HD 101642 Jan2015.pdf    

我不希望模式 lastWriteTime 没有 .pdf 扩展名的文件的长度和名称

输出应该是这样的

Dec2014
Jan2015

我不确定如何过滤它。请指教

【问题讨论】:

    标签: powershell


    【解决方案1】:

    我将首先发布类似于 Leptonator 的答案,但通过使用 Select-Object 命令(代码中使用别名 Select 进行简化,因为这是习惯,而且我很懒)。

    $files = Get-ChildItem -Recurse -path C:\clntfiles | Select -ExpandProperty BaseName
    

    现在你可以得到不带扩展名的文件名。但是,您实际上只要求了部分文件名,因为第一个文件名是“HD 100616 Dec2014.pdf”,并且您指定实际上只希望返回“Dec2014”。我们可以通过几种不同的方式做到这一点,但我最喜欢的是正则表达式匹配(因为正则表达式很棒,我认为LastIndexOf/SubString 组合过于复杂恕我直言)。

    所以,"\w+$" 的正则表达式匹配会得到你想要的。分解如下:

    \w 表示任何字母或数字
    + 表示其中一个或多个
    $ 表示字符串/行的结尾

    所以字符串末尾有 1 个或多个字母数字字符。我们将文件名数组通过管道传递到ForEach-Object 循环中(别名ForEach 出于习惯使用),然后我们有:

    $Files | ForEach{ [RegEx]::Matches($_,"\w+$")}
    

    现在,这会输出一个[System.Text.RegularExpressions.Match] 对象,这比您想要的要多,但它确实有一个属性Value,这正是您所要求的!所以我们再次为该属性使用Select -Expand,输出正是您所要求的:

    $files = Get-ChildItem -Recurse -path C:\clntfiles | Select -ExpandProperty BaseName
    $files | ForEach{[regex]::Matches($_,"\w+$")} | Select -Expand Value
    

    RegEx 匹配真的很方便,如果您了解它们,您可以将其简化得更像这样:

    gci C:\clntfiles -Rec | ?{$_.BaseName -match "(\w+)$"} | %{$Matches[1]}
    

    那一行,以及它上面的两行代码都应该输出:

    Dec2014
    Jan2015
    

    【讨论】:

    • 我假设你也遇到过这种情况gci C:\clntfiles -Rec | %{($_.BaseName -split '\s+')[-1]}
    • 不,我总是忘记您可以对-split 方法使用正则表达式匹配。好点@Matt
    • 您可以安全地使用 split 方法以及常规空间,因为有些人可能更喜欢非正则表达式解决方案。
    【解决方案2】:

    这样的事情应该为你做。

    $files = Get-ChildItem -Recurse -path C:\clntfiles
    
    if ($files -ne $null)
    {
        foreach ($file in $files)
        {
            $file.BaseName
        }
    }
    

    在我的文件夹中,它显示:

    > 2014-03-28_exeresult_file
    > 2014-03-30_exeresult_file
    > 2014-03-31_exeresult_file
    > 2014-04-02_exeresult_file
    > 2014-04-03_exeresult_file
    > 2014-04-04_exeresult_file
    > 2014-04-06_exeresult_file
    > 2014-04-08_exeresult_file
    

    确实是 .txt 文件 希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      使用以下Get-ChildItem -Recurse -name -path C:\clntfiles。这只会让你得到文件名。

      工作解决方案:

      $names = Get-ChildItem -name
      foreach($n in $names) {$n.Substring(0,$n.IndexOf("."))}
      

      如果文件名的一部分是.,您也可以使用LastIndexOf

      【讨论】:

      • 他只想要名字而不想要扩展名。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      相关资源
      最近更新 更多