2014-01-15 55 views
3

我需要在复制过程中重命名文件并删除部分文件名。什么用户添加到文件名之前,我一直在做的很简单:在使用PowerShell复制之前删除部分文件名

,我有工作
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,但学习。这是好东西,但不时挫伤我:)。想法?

谢谢!

回答

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; }; 

我在我的测试中得到的结果似乎表明,移动/重命名操作成功:

如果什么:执行操作“移动文件”目标“项目: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; }; 

结果:

如果:执行操作目标 “移动文件”,“项目:C:\测试\ asdf_blah_asdf_qwer_trew_ytui - Copy.pdf目的地:C:\测试\子测试\ asdf_blah_asdf .PDF”。

0

另一种方式来做到这一点,内联和更简洁(这是你pipleine的最后阶段,一切它之前保持不变):

| mi -Des $PROCDIR\$PDFTYPE\begin_processing\$(($_.Name -split '_')[0..2] -join '_').pdf 

mi -Des相同Move-Item -Destination;我使用简短的版本来将它合并到一行中,但不包含滚动条。)

这样做是将基本文件名拆分为由下划线分隔的部分的数组,选择数组的前三个元素(即,文件名的前三部分),将它们粘贴在一起rscores,并重新插入.pdf扩展名。

另一种方法是使用-replace运营商要摆脱与一个空字符串替换部分匹配:

| mi -Des $PROCDIR\$PDFTYPE\begin_processing\$($_.Name -replace '(_[^_]+){2}(?=\.)', '')