ruyelpequenocid
ruyelpequenocid

Reputation: 55

Renaming one file (and nothing more than ONE file) using PowerShell

The problem

I constantly find myself in need of quick-method to rename a random file here and there while I work. I need to bring these filenames down to a structure compatible with web standards and some personal needs. A few examples below:

When I find                         I need
----------------------------------  -----------------------------------------
Welcome to the party.JPG            welcome_to_the_party.jpg
Instructions (and some other tips)  instructions_and_some_other_tips
Bar Drinks – The Best Recipes       bar_drinks_the_best_recipes
La mañana del águila y el ratón     la_manana_del_aguila_y_el_raton

Basically I need:

Not the question, but just FYI and you can see the big picture

I will be using a registry entry [HKEY_CLASSES_ROOT*\shell...] so I can call a batch file and/or a PowerShell Script by right-clicking the desired file, passing the argument information (the file in question) to the script that way.

My guesses

I have been looking closely at PowerShell Scripts, but I am not very knowledgeable about this area yet and all the solutions provided so far are addressing the entire folder (Dir/Get-ChildItem) instead of a specific file.

For example, I was successful using the line below (PowerShell) to replace all spaces by underscore, but then it affects other files in the directory as well.

Dir | Rename-Item –NewName { $_.name –replace “ “,”_“ }

Again, I do not need to address this problem for the entire folder, since I already have ways of doing so using software like Total Commander.

Thanks for any help you can give me.

Ruy

Upvotes: 1

Views: 825

Answers (3)

Esperento57
Esperento57

Reputation: 17492

may be this code can help you

    function Remove-Diacritics([string]$String)
    {
        $objD = $String.Normalize([Text.NormalizationForm]::FormD)
        $sb = New-Object Text.StringBuilder

        for ($i = 0; $i -lt $objD.Length; $i++) {
            $c = [Globalization.CharUnicodeInfo]::GetUnicodeCategory($objD[$i])
            if($c -ne [Globalization.UnicodeCategory]::NonSpacingMark) {
              [void]$sb.Append($objD[$i])
            }
          }

        return("$sb".Normalize([Text.NormalizationForm]::FormC))
    }

    function Clean-String([string]$String)
    {
        return(Remove-Diacritics ($String.ToLower() -replace "#", "no" -replace "\@", "at" -replace "&", "and" -replace "\(|\)|\[|\]|\{|\}|'|;|\,", "" -replace " ", "_"))
    }


    $youfile="C:\tmp4\121948_DRILLG.tif"
    $younewnamefile=Clean-String $youfile
    Rename-Item -Path $youfile $younewnamefile

Upvotes: 1

Mike Garuccio
Mike Garuccio

Reputation: 2718

If your looking to be able to do this quickly and always want the same changes to be made you can add the following function to a .psm1 file and then place the file in one of your module folders (C:\Program Files\WindowsPowerShell\Modules is the most common one) you'll be able to just call WebRename-File filePath any time you need to quickly rename a file, the function is set up in such a way as to work fine if you pass in a single file path or you can pipe the results of a get-childitem to it if you ever do find the need to do bulk renames.

function WebRename-File {
    param(
    [parameter(Mandatory=$true,ValueFromPipeline=$true)]
      $filePath
    )

    begin{}
    Process{
        foreach($path in $filePath){
            $newPath = $path.ToLower()
            $newPath = $newPath.Replace(' ','_')

            ###add other operations here###

            Rename-Item -Path $path -NewName $newPath
        }
    }
    end{}
}

Upvotes: 0

user2226112
user2226112

Reputation:

Place this script somewhere (let's call it WebRename.ps1):

$old = $args -join ' '
$new = $old.ToLower().Replace(' ', '_')
# add all the remaining transformations you need here
Rename-Item $old $new

In the registry use this as the command (with your own path of course):

PowerShell -c C:\WebRename.ps1 "%1"

Upvotes: 0

Related Questions