Question

I need to either write a batch file or a vbscript that will rename files. I need to keep everything in the file name up to the second "." but delete what comes after the second dot.

This is a sample of what the file names look like:

nnnnnnnnnnnnnnnn.xxxxxxxx.dddddddddd.pdf 
  • n= 16 numbers 0-9
  • x= date in this format ex:02232008
  • d= 10 numbers 0-9, this is the part of the file name that I want to delete.

I need the d's from the sample above to be deleted but keep the rest of the file name the same. I need to be able to run this batch file on a folder that contains about 3,000 pdf files. It can either be put right back into the same folder or outputted into a different folder.

Was it helpful?

Solution

In VBScript, you can use something like

' the file paths. hardcoded, but you could alternatively collect these via command line parameters
Const IN_PATH = "path\to\directory"
Const OUT_PATH = "path\to\another\directory"

' check that the directories exist. you could create them instead, but here
' it just throws an error as that's easier
dim fso: set fso = CreateObject("Scripting.FileSystemObject")
if not fso.FolderExists(IN_PATH) then
    err.raise 1,, "Path '" & IN_PATH & "' not found"
end if
if not fso.FolderExists(OUT_PATH) then
    err.raise 1,, "Path '" & OUT_PATH & "' not found"
end if

dim infolder: set infolder = fso.GetFolder(IN_PATH)
dim file
for each file in infolder.files
    dim name: name = file.name
    dim parts: parts = split(name, ".")
    ' we're expecting a file format of a.b.c.pdf
    ' so we should have 4 elements in the array (zero-indexed, highest bound is 3)
    if UBound(parts) = 3 then
        ' rebuild the name with the 0th, 1st and 3rd elements
        dim newname: newname = parts(0) & "." & parts(1) & "." & parts(3)
        ' use the move() method to effect the rename
        file.move fso.buildpath(OUT_PATH, newname)
    else
        ' log the fact that there's an erroneous file name
        WScript.Echo "Unexpected file format: '" & name & "'"
    end if
next 'file

You would run it in a batch file thus, redirecting output to a log file

cscript rename-script.vbs > logfile.txt

This assumes that you can simply rely on the period to delimit the parts of the file name rather than the specifics of the format of the delimited parts.


To rearrange the date, which I think is in the parts(1) array element, you can simply extract each bit of the string because it's in a specific format:

'date in format mmddyyyy
dim month_, day_, year_, date_
month_ = left(parts(1), 2)
day_ = mid(parts(1), 3, 2)
year_ = right(parts(1), 4)
date_ = year_ & month_ & day_ ' now yyyymmdd

so when rebuilding the filename, you can replace parts(1) with the new formatted date

dim newname: newname = parts(0) & "." & date_ & "." & parts(3)

OTHER TIPS

FOR /F "USEBACKQ delims=. tokens=1-4" %%F IN (`DIR /B /A-D "C:\Path\To\PDFs\"`) DO (
  REN "%%~fF.%%G.%%H.%%I" "%%F.%%G.%%I"
)

If you have files that vary in how many periods there are, just need to add a simple argument to count how many period delimiters exist then execute.

Using StringSolver, a semi-automatic renaming tool, just rename the first file, check that the generalized renaming is ok, and then accept it on all other files.

> move 1234567890123456.02232008.1946738250.pdf 1234567890123456.02232008.pdf

Get the explanation:

> move --explain

the file name until the end of the second number + the extension

If you are satisfied, you can run the semi-automated tool using move --auto or the succint version:

> move

DISCLAIMER: I am a co-author of this free software made for academic purposes.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top