我想将文件移动到另一个文件夹,成为两个文件名不同的文件,包括日期时间,前缀和特定字符。然后在完成后删除原始文件。
例如,我有c:\source\aaa.pdf
并希望将其复制到
c:\destination\12345_TPE_aaa_20180614151500.pdf
c:\destination\12345_TXG_aaa_20180614151500.pdf
c:\source\aaa.pdf
。现在我甚至只被改变了文件名,我试过
Get-ChildItem *.pdf | rename-item -newname ('12345'+'_TPE'+$_.Name+'_'+(Get-Date -f yyyymmddhhmmss)+'.pdf')
但不包括原始名称。
有专家可以帮忙吗?
答案 0 :(得分:2)
这是一个相当简单的修复,实际上:$_
仅存在于 scriptblocks 中,它们是cmdlet的参数。你一直在使用普通括号,它不是一个scriptblock。只需更改如下:
Get-ChildItem *.pdf | rename-item -newname {'12345'+'_TPE'+$_.Basename+'_'+(Get-Date -f yyyyMMddhHHmmss)+'.pdf'}
(另外,你的日期格式字符串是可疑的,因为你包括分钟而不是几个月;我已经修复了。)
或者,使用单个格式字符串作为稍微容易阅读的替代方案,可能是:
Get-ChildItem *.pdf |
Rename-Item -NewName { '{0}_TPE_{1}_{2:yyyyMMddHHmmss}.pdf' -f 12345,$_.Basename,(Get-Date) }
答案 1 :(得分:0)
这是你问题的另一部分 -
$source = "C:\Source"
$dest = "C:\Destination"
$files = Get-ChildItem *.pdf
foreach($file in $files)
{
$filename1 = '12345'+'_TPE_'+$file.Basename+'_'+(Get-Date -f yyyymmddhhmmss)+'.pdf'
$filename2 = '12345'+'_TXG_'+$file.Basename+'_'+(Get-Date -f yyyymmddhhmmss)+'.pdf'
Copy-Item $file.FullName -Destination $dest -PassThru | Rename-Item -NewName $filename1
Copy-Item $file.FullName -Destination $dest -PassThru | Rename-Item -NewName $filename2
Remove-Item $file.FullName -Force
}
可以用连续的管道做得那么小,但现在更容易理解,看起来更干净。
答案 2 :(得分:0)
您可以使用ForEach-Object
循环播放从Get-ChildItem
获取的文件。
然后将文件复制到每个目标作为新名称。这样可以节省复制,然后重命名文件。
然后最后从源中删除原始文件。
$source = "c:\source"
$destination = "C:\destination"
Get-ChildItem -Path $source -Filter *.txt | ForEach-Object {
$date = Get-Date -Format yyyyMMddhHHmmss
Copy-Item -Path $_ -Destination "$destination\12345_TPE_$($_.Basename)_$date.pdf"
Copy-Item -Path $_ -Destination "$destination\12345_TXG_$($_.Basename)_$date.pdf"
Remove-Item -Path $_
}
答案 3 :(得分:0)
我喜欢Joey采用模块化的方式,以此扩展
## Q:\Test\2018\06\14\SO_50852052.ps1
$Src = 'C:\Source'
$Dst = 'c:\destination'
$Prefix = '12345'
$Types = 'TPE','TPG'
Get-ChildItem -Path $Src *.pdf | ForEach-Object {
ForEach ($Type in $Types){
$_ | Copy-Item -Destination (Join-Path $Dst (
"{0}_{1}_{2}_{3:yyyyMMddHHmmss}.pdf" -f $Prefix,$Type,$_.Basename,(Get-Date)))
}
$_ | Remove-Item
}