Windows cmd命令用于从文件名中剥离版本?

时间:2018-06-28 19:13:43

标签: powershell batch-rename

需要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 *”,并获得一组非常干净的非版本化文件。如果该命令由于存在多个版本而导致文件名重复,那么它将完全跳过该操作。

TIA

2 个答案:

答案 0 :(得分:0)

不知道如何在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将文件重命名为新名称。

答案 1 :(得分:0)

为此脚本块的$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脚本相同的方式使用。