powershell过滤器,用于删除文件名中的.pdf扩展名

时间:2015-05-14 21:10:40

标签: powershell

我正在尝试使用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    

我不希望Mode lastWriteTime Length和没有.pdf扩展名的文件名

输出应该像

Dec2014
Jan2015

我不知道如何过滤它。请指教

3 个答案:

答案 0 :(得分:1)

这样的事情应该为你做.. ..

$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文件 希望这有帮助!

答案 1 :(得分:1)

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

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

现在,您可以获得没有扩展名的文件名。但是,您实际上只询问了部分文件名,因为第一个文件名是“HD 100616 Dec2014.pdf”,并且您指定实际上只需要返回“Dec2014”。我们可以通过几种不同的方式做到这一点,但我最喜欢的是RegEx匹配(因为RegEx很棒,我认为LastIndexOf / SubString组合过于复杂了。)

因此,"\w+$"的RegEx匹配将获得您想要的结果。这样就分解了:

\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

答案 2 :(得分:0)

使用以下Get-ChildItem -Recurse -name -path C:\clntfiles。这将只为您提供文件名。

工作解决方案:

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

如果文件名的一部分为LastIndexOf

,您也可以使用.