我正在尝试使用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
我不知道如何过滤它。请指教
答案 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
.