复制文件重命名(如果已存在)PowerShell

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了复制文件重命名(如果已存在)PowerShell相关的知识,希望对你有一定的参考价值。

如果文件是重复的,则此脚本可以在复制文件时重命名文件。我需要先重命名当前目标文件,然后按原样复制源文件。有任何想法吗?

function Copy-FilesWithVersioning{
    Param(
        [string]$source,
        [string]$destination
    )
    Get-ChildItem -Path $source -File
        ForEach-Object {
            $destinationFile = Join-Path $destination $file.Name
            if ($f = Get-Item $destinationFile -EA 0) {
                # loop for number goes here
                $i = 1
                $newname = $f.Name -replace $f.BaseName, "$($f.BaseName)_$I")
                Rename-Item $destinationFile $newName
            }
            Copy-Item $_ $destination
        }
}

Copy-FilesWithVersioning c:scriptsSource c:scriptsDestinationA

错误:

At line:10 char:53
+             if($f = Get-Item $destinationFile -EA 0){
+                                                     ~
Missing closing '}' in statement block or type definition.
At line:8 char:23
+         ForEach-Object{
+                       ~
Missing closing '}' in statement block or type definition.
At line:2 char:34
+ function Copy-FilesWithVersioning{
+                                  ~
Missing closing '}' in statement block or type definition.
At line:13 char:77
+ ...         $newname = $f.Name -replace $f.BaseName, "$($f.BaseName)_$I")
+                                                                         ~
Unexpected token ')' in expression or statement.
At line:15 char:13
+             }
+             ~
Unexpected token '}' in expression or statement.
At line:17 char:9
+         }
+         ~
Unexpected token '}' in expression or statement.
At line:18 char:1
+ }
+ ~
Unexpected token '}' in expression or statement.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MissingEndCurlyBrace
答案

尝试使用此链接中的代码:https://www.pdq.com/blog/copy-individual-files-and-rename-duplicates/

$SourceFile = "C:TempFile.txt"
$DestinationFile = "C:TempNonexistentDirectoryFile.txt"

If (Test-Path $DestinationFile) {
    $i = 0
    While (Test-Path $DestinationFile) {
        $i += 1
        $DestinationFile = "C:TempNonexistentDirectoryFile$i.txt"
    }
} Else {
    New-Item -ItemType File -Path $DestinationFile -Force
}

Copy-Item -Path $SourceFile -Destination $DestinationFile -Force 
另一答案

您看到的错误是由此行中的虚假右括号引起的:

$newname = $f.Name -replace $f.BaseName, "$($f.BaseName)_$I")

从行尾删除括号,这些错误将消失。

但是,您的代码中还有其他一些错误,因此即使修复了这些错误,代码仍然无法正常工作。

  • 你错过了Get-ChildItemForEach-Object之间的管道。将一个cmdlet的输出传递给另一个cmdlet是必需的。 Get-ChildItem -Path $source -File | ForEach-Object { ... }
  • 变量$file未定义。在PowerShell管道中,您希望使用“当前对象”变量($_)。改变这一行 $destinationFile = Join-Path $destination $file.Name $destinationFile = Join-Path $destination $_.Name
  • $_在声明中 Copy-Item $_ $destination 被扩展为文件的名称,而不是完整路径。改变成 Copy-Item $_.FullName $destination 更好的是,在Copy-Item之后移动ForEach-Object语句,因此您不需要首先显式指定源(cmdlet从管道读取输入): Get-ChildItem ... | ForEach-Object { ... $_ # need this line to pass the current object back into the pipeline } | Copy-Item -Destination $destination 请注意,必须将当前对象输出回管道,并将目标指定为命名参数(-Destination $destination),以便后者工作。
  • 检查目标文件夹中是否存在文件有点尴尬。请改用Test-Path。您可以从当前对象构造新文件名。 if (Test-Path -LiteralPath $destinationFile) { $i = 1 Rename-Item $destinationFile ($_.BaseName + "_$i" + $_.Extension) }

以上是关于复制文件重命名(如果已存在)PowerShell的主要内容,如果未能解决你的问题,请参考以下文章

重命名文件(如果已存在)-php 文件上传

如果文件已存在,则重命名文件

如果文件已存在,则重命名文件

Powershell-批量重命名替换文件名

如何在 PowerShell 中使用条件语句重命名文件

在linux下复制文件到另外一个目录并且重命名的具体操作如何?