How can I use powershell to rename files with padded zeros - powershell

I need to limit the files affected to Example*.pdf. The files have 1-3 digits in the names and I need to standardize them. So Example_1.pdf -> Example_001.pdf while Example_100.pdf -> Example_100.pdf
The first part renamed files to Example.1.pdf so I could parse them with a single delimiter, but it gave me errors on the second step (cmdlet rename-item at command pipeline position 1 supply values for the following parameters: path)
Get-ChildItem of* | rename-item -newname { $_.Name -replace '_','.' }
Get-ChildItem of* |
foreach {
$nameArray = $_.Split('.')
$ExampleNumber = $nameArray[1]
rename-item -path $Path -newname $nameArray[0]+$ExampleNumber+$nameArray[2]
}
But if I can get something like this to work then I can play around with $ExampleNumber
Then I tried using regular expressions. Had this worked it would have padded the single digit files and then I could make a second pass for double digit files. But it didn't rename anything.
Get-ChildItem ex* | rename-item -newname { $_ -replace '(.*)(\d{1})\.pdf', 'Example_0$2.pdf'}
Any help is appreciated.

Note the $_ inside the -NewName block is of type FileInfo.
Here's my suggestion:
Get-ChildItem ex* | Rename-Item -NewName {
[void]($_.Name -match "\d+")
$_.Name -replace "\d+", (([int]$Matches[0]).ToString("000"))
}
Or alternatively:
Get-ChildItem ex* |
Rename-Item -NewName {
$_.Name -replace "\d+", (([int][regex]::match($_.Name, "\d+").value).ToString("000"))}

Related

How to add a symbol in a middle of a file name in PS

I have modified several thousand files with a various things requested by the owners.
Now, I need to add one final thing and I am not 100% on how to do it.
Scenario is as follows - all files have a 10 digit number at the start, I need to add a hyphen after the number. String is a variable but it is always the same length.
1234567890abcdefgh.xls would be an example
I have used GCI to make changes to symbols and static parts but not sure how to call for insertion in a specific place of a file (after the 10th character of a variable string)
Any ideas would be most welcome!
You can use the $matches you get from the capturing groups of a -match comparison:
(Get-ChildItem -Path 'X:\WhereTheFilesAre' -File) |
Where-Object { $_.BaseName -match '^(\d{10})([^-].*)' } |
Rename-Item -NewName { '{0}-{1}{2}' -f $matches[1], $matches[2], $_.Extension }
or by using the Substring() method:
(Get-ChildItem -Path 'X:\WhereTheFilesAre' -File) |
Where-Object { $_.BaseName -match '^\d{10}[^-]' } |
Rename-Item -NewName { $_.Name.Substring(0,10) + '-' + $_.Name.Substring(10) }
or use the regex -replace operator:
(Get-ChildItem -Path 'X:\WhereTheFilesAre' -File) |
Where-Object { $_.BaseName -match '^\d{10}[^-]' } |
Rename-Item -NewName { $_.Name -replace '^(\d{10})', '$1-' }
You can use string.Insert() to insert a string into another at a specific offset:
PS ~> '1234567890abcdefgh.xls'.Insert(10, '-')
1234567890-abcdefgh.xls
To apply to all files in a directory, you could do something like this:
Get-ChildItem -File |Where-Object Name -match '^\d{10}[^-]' |Rename-Item -NewName { $_.Name.Insert(10, '-') }
The regular expression pattern ^\d{10}[^-] will only match file names that start with 10 digits followed by something other than a hyphen (to avoid renaming files that already comply with the naming convention)

Rename-Items twice in the same pipeline using powershell

I'm trying to rename a bunch of files using powershell by removing the prefix (which is the same in all files), replacing "+" with a space and setting the remainder to title case. Here's what I have so far:
Where-Object { $_ -Match '^Website\.com_+' } |
ForEach-Object
{
$_ |
Rename-Item -NewName {$_.Name -replace 'Website\.com_','' -replace '\+',' '};
Rename-Item $_.Fullname (Get-Culture).TextInfo.ToTitleCase($_)
}
The first rename works, it removes and formats files properly, but then the second rename says the items don't exist, which makes me think I should just then pass them into another foreach loop in another pipe, but I can't seem to make that work either.
It seems like having 2 rename-items isn't really working and I tried having the title case with the replace and it doesn't seem to work either.
It would be more straight forward to build the name in 2 stages and then do one Rename-Item
Something like below should do what you need
Where-Object { $_ -Match '^Website\.com_+' } |
ForEach-Object {
$BaseName = ($_.Name -replace 'website\.com','' -replace '\+','')
$FinalName = (Get-Culture).TextInfo.ToTitleCase($BaseName)
Rename-Item $_.FullName -NewName $FinalName
}
$_ in your ForEach-Object loop is a snapshot of the item - it won't dynamically change to follow things you do to the underlying file. When you rename the item, $_ represents the old name. So, when you attempt the second rename based on $_.FullName, Rename-Item won't find anything.
A potential solution to your problem of "setting the remainder to title case" would be, outside the loop, do another Get-ChildItem search for anything that falls into this condition, and then rename them separately.
Finally found something that works:
$path = "G:\Downloads\Chrome\test2"
$items = (Get-ChildItem -Path $path -File *.mp4 |
Where-Object { $_ -Match '^Website\.com_+' } |
ForEach-Object{
$_ |
Rename-Item -NewName {$_.Name -replace 'Website\.com_','' -replace '\+',' '} -PassThru
})
$items | % {
Rename-Item -Path $_.FullName -NewName (Get-Culture).TextInfo.ToTitleCase($_.Name)
}
Thanks to everyone who tried to help me!

Powershell rename multiple files

Example "rename multiple files" gives us this:
Get-ChildItem *.txt | Rename-Item -NewName { $_.Name -replace '.txt','.log' }
But I need something like this:
Get-ChildItem *.txt | Rename-Item -NewName { $_.Name -replace '.txt','someArray[$i]' }
How can I do that ?
Simple. Take the quotes off and add a $:
EDIT: Ok, here's my guess. I don't know what $textfile is, or what result you want exactly. [^.jpg] just means any character except those 4.
get-childitem *.jpg |
Foreach {$i=0} {Rename-Item $_ -NewName ($_.name -replace 'jpg', $textfile[$i++]) -whatif}

How do I remove Blank Space from File Names

I am trying to remove blank spaces from many file names using PowerShell 3.0. Here is the code that I am working with:
$Files = Get-ChildItem -Path "C:\PowershellTests\With_Space"
Copy-Item $Files.FullName -Destination C:\PowershellTests\Without_Space
Set-Location -Path C:\PowershellTests\Without_Space
Get-ChildItem *.txt | Rename-Item -NewName { $_.Name -replace ' ','' }
For example: the With_Space directory has these files:
Cable Report 3413109.pdf
Control List 3.txt
Test Result Phase 2.doc
The Without_Space directory will need the above file name to be:
CableReport3413109.pdf
ControlList3.txt
TestResultPhase 2.doc
Currently, the script shows no error but it only copies the source files to the destination folder, but doesn't remove the spaces in file names.
Your code should work just fine, but since Get-ChildItem *.txt lists only .txt files the last statement should remove the spaces from just the text files, giving you a result like this:
Cable Report 3413109.pdf
ControlList3.txt
Test Result Phase 2.doc
This should remove spaces from the names of all files in the folder:
Get-ChildItem -File | Rename-Item -NewName { $_.Name -replace ' ','' }
Prior to PowerShell v3 use this to restrict processing to just files:
Get-ChildItem | Where-Object { -not $_.PSIsContainer } |
Rename-Item -NewName { $_.Name -replace ' ','' }
something like this could work
$source = 'C:\temp\new'
$dest = 'C:\temp\new1'
Get-ChildItem $source | % {copy $_.FullName $(join-path $dest ($_.name -replace ' '))}
I think your script should almost work, except $_ isn't going to be defined as anything. By using the for-each cmdlet (%), you assign it and then can use it.
Get-ChildItem *.txt | %{Rename-Item -NewName ( $_.Name -replace ' ','' )}
EDIT:
That interpretation was totally wrong. Some people seem to have found it useful, but as soon as you have something being piped, it appears that $_ references the object currently in the pipe. My bad.

Remove nth character from filename in PowerShell

I have a large number of files in a number of directories with this type of naming convention:
"BU1_KCG_RANDOM_030515.csv", etc.
I need to remove the 16th and 17th characters. So the new file name would be "BU1_KCG_RANDOM_0515.csv".
How can I iterate the multiple directory renaming accordingly?
So far I have got the below, but I am not sure what would come next.
Get-ChildItem -Filter *.csv -Recurse | Rename-Item -NewName {$_.Name..................}
Using -replace:
Get-ChildItem -Filter *.csv -Recurse |
foreach { $_ | rename-item -newname ($_.Name -replace '(.{15})..(.+)','$1$2') }
I much prefer mjolinor's answer, but you can always do things in a different way with PowerShell. Since you can index a string like a char array we can use a little array notation to get the characters you want as well.
$oldname = "BU1_KCG_RANDOM_030515.csv"
$newname = -join $oldname[0..14 + 17..($oldname.Length)]
$newname
BU1_KCG_RANDOM_0515.csv
We also need to use -join to convert the array back into a string.
Bit basic, eg doesn't check if the file has already been renamed, but should get you to the next step
gci -filter *.csv -rec | % { Rename-Item $_ -newname ($_.Name.substring(0,15) + $_.Name.substring(17)) }
where
gci = get-childitem
% = for-each
$_ = this (inside the for-each)