使用PowerShell复制文件前删除文件名的一部分

3
我需要在文件复制过程中重命名文件并删除文件名的一部分。 在用户添加文件名之前,我之前所做的是简单的:
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仍然很陌生,但我正在学习。它很好用,但有时会让我感到沮丧:)。 有什么建议吗?
谢谢!
2个回答

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 Destination:C:\ Windows \ System32 \ WindowsPowerShell \ v1.0 \ $ PROCDIR \ $ PDFTYPE \ begin_processing \ asdf_blah_a sdf.pdf”上执行“Move File”操作。

您可以安全地忽略我的示例中虚假的目标路径,因为我没有定义 $ 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 目的地:C:\test\subtest\asdf_blah_asdf.pdf" 上执行“移动文件”操作。


0

另一种更简洁的内联方式来完成它(这是您的管道的最后阶段;在此之前的所有内容都保持不变):

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

(mi -DesMove-Item -Destination相同;我使用了简短的版本,以便将其放入一行中而无需滚动条。)

这样做的作用是将基本文件名拆分为下划线分隔的部分数组,选择数组的前三个元素(即文件名的前三个部分),用下划线将它们粘合在一起,并将.pdf扩展名添加回去。

另一种方法是使用-replace运算符匹配要删除的部分,并用空字符串替换它:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接