Sorting 文件名唯一部分的powershell列表
我有多台机器将文件上传到一个FTP目录。文件名的第一部分是机器,其余部分是时间戳,例如AAAAA_20130312_125113 现在,我想获得一个已上载到此目录的所有唯一计算机的排序列表。 我设法将丢失的所有文件名。子字符串(0,5)写入主机,但我仍然没有唯一的计算机名Sorting 文件名唯一部分的powershell列表,sorting,powershell,unique,filenames,Sorting,Powershell,Unique,Filenames,我有多台机器将文件上传到一个FTP目录。文件名的第一部分是机器,其余部分是时间戳,例如AAAAA_20130312_125113 现在,我想获得一个已上载到此目录的所有唯一计算机的排序列表。 我设法将丢失的所有文件名。子字符串(0,5)写入主机,但我仍然没有唯一的计算机名 $files=Get-ChildItem $strMOVETO -Name -Include TAS*.csv -Recurse ForEach ($i in $files) { Write-Host $i.Substring
$files=Get-ChildItem $strMOVETO -Name -Include TAS*.csv -Recurse
ForEach ($i in $files) { Write-Host $i.Substring(0,5) }
有没有关于如何做到这一点的提示?不必是一行,尽管这将是一个很好的挑战;-)
谢谢 将命令的结果导入一个
| sort-unique
$files=Get-ChildItem $strMOVETO -Name -Include TAS*.csv -Recurse
ForEach ($i in $files) { Write-Host $i.Substring(0,5) } | sort -unique
…但最好还是简化脚本
$filter = "TAS*.csv"
Get-ChildItem -Path $strMOVETO -Filter $filter -Recurse | % {$_.BaseName.Substring(0,5) } | sort -unique
未测试,但类似于以下内容:
Get-ChildItem $strMOVETO -Name -Include TAS*.csv -Recurse | % { $_.Name.Substring(0,5) } | Sort -Unique
您不需要在循环中写入主机,使用%而不是foreach循环更容易。当您有一个8个字符的机器名时会发生什么?您的
子字符串将中断。由于机器名、日期和时间由一个\uuu
分隔,因此在此基础上拆分并获取第一项
Get-ChildItem $strMOVETO -recurse -name -include TAS*.csv|%{$_.split("_")[0]}|sort-object -unique
要同时按日期筛选,请执行以下操作:
Get-ChildItem $strMOVETO -recurse -include TAS*.csv|where-object{$_.lastwritetime -ge (get-date).adddays(-1)}|%{$_.basename.split("_")[1]}|sort-object -unique
机器名长度确实是可变的。假设[1]而不是[0]将接受第二项(如过滤器中的TAS_xxxxxxxx),则在最后一个管道前放置一个},这样就完成了!感谢我将此命令与Where对象{$\ LastWriteTime-ge(Get Date).AddDays(-1)}结合使用?!?如果我省略了-Name标记,则拆分不起作用;如果我使用-Name标记,则LastWriteTime不可用……是的,您可以看到我的编辑。拆分不起作用,因为现在您省略了-Name
,您得到的是一个对象集合,而不仅仅是一个名称列表。Briliant,您救了我一天;-)请注意,-Name
与-Recurse
组合时,返回(相对)路径,而不仅仅是位于子树下更远位置的文件的文件名,在这种情况下,$\u.split(“\u”)[0]
将无法按预期工作。作为旁白:,除非目的是仅写入显示,从而绕过PowerShell的成功输出流,从而能够将输出发送到其他命令、在变量中捕获或重定向到文件。也就是说,在PSv5+中,写入主机现在写入到,其输出可以被捕获,但只能通过6>
。