使用powershell复制文件并使用datetime更改文件名

时间:2018-06-14 07:36:26

标签: powershell

我想将文件移动到另一个文件夹,成为两个文件名不同的文件,包括日期时间,前缀和特定字符。然后在完成后删除原始文件。

例如,我有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') 

但不包括原始名称。

有专家可以帮忙吗?

4 个答案:

答案 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 
}