我需要在复制过程中重命名文件,并去掉文件名的一部分。在用户添加到文件名之前,我一直在做的事情很简单:
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的新手,但正在学习。这是很好的东西,但有时会让我感到沮丧:)。想法?
谢谢!
发布于 2014-01-15 12:28:41
下面是一个正则表达式解决方案,它可能会对您有所帮助:
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 Destination: 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:\test\asdf_blah_asdf_qwer_trew_ytui - Copy.pdf Destination: C:\test\subtest\asdf_blah_asdf.pdf".
发布于 2014-01-15 15:08:20
另一种方法,内联和更简洁(这是管道的最后一个阶段;它之前的一切保持不变):
| 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}(?=\.)', '')https://stackoverflow.com/questions/21128244
复制相似问题