Команда Windows cmd для удаления версий из имен файлов? - PullRequest
0 голосов
/ 28 июня 2018

Нужна команда Windows cmd для переименования файлов в имена без номеров версий, например ::

  filename.exa.1     =>    filename.exa
filename_a.exb.23    =>  filename_a.exb
filename_b.exc.4567  =>  filename_b.exc

Имена файлов имеют переменное количество символов, а основное расширение всегда составляет 3 символа.

У меня когда-то был сценарий Solaris "stripv", чтобы выполнить это. Я мог бы ввести "stripv *" в каталог и получить хороший чистый набор файлов без версий. Если из-за наличия нескольких версий команда приведет к дублированию имен файлов, она просто пропустит операцию.

ТИА

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Укажите имя папки для переменной $Folder этого блока скриптов, и она будет перечислять элементы в этой папке, найдет последний символ '.' в имени файла и переименует его как все до '.'.

Например: Filename.123.wrcrw.txt.123 будет переименовано в Filename.123.wrcrw.txt, или в вашем случае ваши файлы потеряют посторонние символы с окончательного '.' и далее. Если новое имя для файла уже существует, он напишет предупреждение о том, что не может переименовать файл, и продолжит работу без попыток.

$Folder = "C:\ProgramData\Temp"

Get-ChildItem -Path $Folder | Foreach {

    $NewName = $_.Name.Substring(0,$_.Name.LastIndexOf('.'))

        IF (!(Test-Path $Folder\$NewName))
        {
            Rename-Item $Folder\$_ -NewName $NewName
        }
        Else
        {
            Write-Warning "$($_.Name) cannot be renamed, $NewName already exists."
        }

}

Это должно эффективно имитировать поведение, которое вы описали для stripv *. Это можно легко превратить в функцию с именем stripv и добавить в свой профиль PowerShell, чтобы сделать ее доступной в командной строке в интерактивном режиме и использовать так же, как и сценарий Solaris.

0 голосов
/ 29 июня 2018

Не знаю, как это сделать в CMD, но вот несколько Powershell, которые будут работать для вас:

# Quick way to get an array of filenames. You could also create a proper array,
# or read each line into an array from a file.
$filepaths = @"
C:\full\path\to\filename.exa.1
C:\full\path\to\filename_a.exb.23
\\server\share\path\to\filename_b.exc.4567
"@ -Split "`n"

# For each path in $filepaths
$filepaths | Foreach-Object {
  $path = $_

  # Split-Path -Leaf gets only the filename
  # -Replace expression just means to match on the ".number" at the end of the 
  # filename and replace it with an empty string (effectively removing it)
  $newFilename = ( Split-Path -Leaf $path ) -Replace '\.\d+$', ''

  # Warning output
  Write-Warning "Renaming '${path}' to '${newFilename}'"

  # Rename the file to the new name
  Rename-Item -Path $path -NewName $newFilename
}

По сути, этот код создает массив полных путей к файлам. Для каждого пути он удаляет имя файла из полного пути и заменяет шаблон .number в конце ничем, что удаляет его из имени файла. Теперь, когда у нас есть новое имя файла, мы используем Rename-Item, чтобы переименовать файл с новым именем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...