Переместить файл Powershell с резервной копией (например, mv --backup = numbered) - PullRequest
0 голосов
/ 05 сентября 2018

Я смотрю, есть ли команда PS, которая была бы равна mv --backup = пронумерована, и не может ничего найти.

По сути, переместите «file» в «file.old», но если «file.old» существует, «file» следует переместить в «file.old.2».

На данный момент самое близкое, что я нашел по этой ссылке: https://www.pdq.com/blog/copy-individual-files-and-rename-duplicates/:

$SourceFile = "C:\Temp\File.txt"
$DestinationFile = "C:\Temp\NonexistentDirectory\File.txt"

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

Copy-Item -Path $SourceFile -Destination $DestinationFile -Force 

Кажется, довольно ужасно иметь такое количество кода. Есть что-нибудь попроще доступное?

1 Ответ

0 голосов
/ 05 сентября 2018

Действительно, для этого нет встроенной функции. Однако не должно быть проблемой использовать собственную функцию для этой цели.

Как насчет этого:

function Copy-FileNumbered {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory = $true, Position = 0)]
        [ValidateScript({Test-Path -Path $_ -PathType Leaf})]
        [string]$SourceFile,

        [Parameter(Mandatory = $true, Position = 1)]
        [string]$DestinationFile
    )
    # get the directory of the destination file and create if it does not exist
    $directory = Split-Path -Path $DestinationFile -Parent
    if (!(Test-Path -Path $directory -PathType Container)) {
        New-Item -Path $directory -ItemType 'Directory' -Force
    }

    $baseName  = [System.IO.Path]::GetFileNameWithoutExtension($DestinationFile)
    $extension = [System.IO.Path]::GetExtension($DestinationFile)    # this includes the dot
    $allFiles  = Get-ChildItem $directory | Where-Object {$_.PSIsContainer -eq $false} | Foreach-Object {$_.Name}
    $newFile = $baseName + $extension
    $count = 1
    while ($allFiles -contains $newFile) {
        $newFile = "{0}({1}){2}" -f $baseName, $count, $extension
        $count++
    }

    Copy-Item -Path $SourceFile -Destination (Join-Path $directory $newFile) -Force 
}

Это создаст новый файл в месте назначения, как File(1).txt Конечно, если у вас есть имена типа File.2.txt, просто измените шаблон формата "{0}({1}){2}" на "{0}.{1}{2}"

Используйте функцию как

$SourceFile = "C:\Temp\File.txt"
$DestinationFile = "C:\Temp\NonexistentDirectory\File.txt"
Copy-FileNumbered -SourceFile $SourceFile -DestinationFile $DestinationFile
...