我需要在复制过程中重命名文件并删除部分文件名。在用户添加到文件名之前我一直在做的事情很简单:
dir $PROCDIR\$PDFTYPE\holding_pattern\*.pdf -recurse | sort -property lastwritetime | select -first 1 | move-item -destination $PROCDIR\$PDFTYPE\begin_processing
我正在使用的文件名格式现在是xxx_xxx_xxx_xxx_xxx.pdf,其中_分开信息。 x只是一个例子,因为该文件可以命名为LakeTahoe_February15_Airplane_0115201457_baseball.pdf。当我执行副本时,我需要保留前三个....所以从aaa_aaa_aaa_aaa_aaa.pdf到aaa_aaa_aaa.pdf。基本上剥离了最后两个。如果除了LakeTahoe_February15_Airplane_.pdf之外什么都没有,我想摆脱最后的“_”。
我对powershell仍然很新,但学习。这是好事,但不时让我感到沮丧:)。想法?
谢谢!
答案 0 :(得分:1)
这是一个可以帮助你的正则表达式解决方案:
dir $PROCDIR\$PDFTYPE\holding_pattern\*.pdf | sort -property lastwritetime | select -first 1 | % { $_.Name -match '.*?_.*?_.*?(?=_)'; $Target = '$PROCDIR\$PDFTYPE\begin_processing\{0}.pdf' -f $matches[0]; Move-Item -Path $_.FullName -Destination $Target -WhatIf; };
我在测试期间得到的结果似乎表明移动/重命名操作成功:
如果:在目标“Item:C:\ test \ asdf_blah_asdf_qwer_trew_ytui - Copy.pdf目的地:C:\ Windows \ System32 \ WindowsPowerShell \ v1.0 \ $ PROCDIR \ $ PDFTYPE \ begin_processing上执行”移动文件“操作\ asdf_blah_a sdf.pdf”。
您可以放心地忽略我示例中的假目的地路径,因为我没有定义$ProcDir
和$PDFType
变量。
这是一个在多行上更具可读性的版本。
Get-ChildItem -Path c:\test\*.pdf |
Sort-Object -Property lastwritetime | Select-Object -First 1 |
ForEach-Object -Process { $_.Name -match '.*?_.*?_.*?(?=_)'; $Target = 'c:\test\subtest\{0}.pdf' -f $matches[0]; Move-Item -Path $_.FullName -Destination $Target -WhatIf; };
结果:
如果:在目标“Item:C:\ test \ asdf_blah_asdf_qwer_trew_ytui - Copy.pdf目的地:C:\ test \ subtest \ asdf_blah_asdf.pdf”上执行“移动文件”操作。
答案 1 :(得分:0)
另一种方法,内联和更简洁(这是你的pipleine的最后一个阶段;它之前的一切都保持不变):
| mi -Des $PROCDIR\$PDFTYPE\begin_processing\$(($_.Name -split '_')[0..2] -join '_').pdf
(mi -Des
与Move-Item -Destination
相同;我使用短版本将其放入一行而不使用滚动条。)
这样做是将基本文件名拆分为下划线分隔部分的数组,选择数组的前三个元素(即文件名的前三个部分),将它们与下划线粘合在一起,以及大头钉重新开始.pdf
扩展。
另一种方法是使用 -replace 运算符来匹配您想要删除的部分,并将其替换为空字符串:
| mi -Des $PROCDIR\$PDFTYPE\begin_processing\$($_.Name -replace '(_[^_]+){2}(?=\.)', '')