繁体   English   中英

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

[英]powershell filter to remove .pdf extension in the name of a file

我正在尝试使用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长度和没有.pdf扩展名的文件名

输出应该像

Dec2014
Jan2015

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

这样的事情应该为您做。

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

我将从发布与Leptonator的答案类似的内容开始,但通过使用Select-Object命令简化(别名Select在代码中使用,因为它是习惯,而且我很懒)。

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

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

因此,RegEx匹配"\\w+$"将得到您想要的。 这样分解:

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

因此,该字符串的末尾是1个或多个字母数字字符。 我们将文件名数组通过管道ForEach-ObjectForEach-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

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

工作解决方案:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM