Okey, later when I remove bugs we'll do easy test to see any menu loaded to Bridge is present at it's place...
EDIT:
Save it as Item.jsx on your (& run from) desktop (paste to noteapd & then saving insert a name into dbl quotes: "Item.jsx"):
#target bridge
new MenuElement("command", "Item", "at the end of Thumbnail")
When you click with right mouse button on any folder/file or even outside in the 'Content' area you will see a list of default items (commands) starting with "Open" and then other like "Paste", "Cut" etc. At the bottom of this list you should see new item, named "Item". I checked 2018 Bridge documentation and menu / commands section is alike CS 6 version. Perhaps you must allow this script to be loaded each time at start of Bridge. Edit/Preferences/StartupScripts. Then find checkbox for Item and check it (don't forget to tell me that was there in case script still won't be working). Then reopen Br and script should be loaded. If not, check again that SS section. If there is not script listed then maybe it's not in proper Startup Scripts folder. But if you copied before it to in and then at startup of Bridge you got that error you posted a screen of it means Br detected this script for sure inside a folder that should be put in. Anyway, below is the newest VERSION II of script for you:
#target bridge
NtC = new MenuElement("command", "Name \
to Caption", "at the end of Thumbnail")
NtC.onSelect = function() {
function rec(sF, dst, i) {
if (fld = io(sF)) sF = sF.getFiles(); for(; i < sF.length; i++) {
if (io(fof = sF)) dst.push(fof.name), rec(fof, dst, 0)
else if(/.jpg$/i.test(fof)) {
function reg(v) {return v.replace(/_/g, ' ')}
ns = 'http://ns.adobe.com/photoshop/1.0/';
(md = new Thumbnail(fof).synchronousMetadata).namespace = ns
md.Caption = (spc = reg((nme = decodeURI(dec = decodeURI(fn = fof.name))))).slice(0, -4)
I = 0; while(nme != dec && fn == fof.name && I < 5) $.sleep(50), I += !fof.rename(spc)
}
}
return dst
}
function io(v) {return v instanceof Folder}
if ((sel = app.document.selections[0])
&& io(spec = sel.spec)) rec(spec, [], 0)
}
When you copy it to notepad DON'T FORGET to remove additional white spaces from after slash at end of second line!
This script browses entire content of selected folder, so all deepest nasted subfolders with all jpg images. Do not select more folders at once however only (first ?) one will be processed. It adds to description field name of file without extension, and change name of file to decoded. Both, that field and name of each file gets new name, where underscores are replaced with spaces, while all URL characters decoded. When in the same folder there is already a file with a desired name for source file then source one won't be changed to new version. It only will get new name in description field.
I tested it on hundrets files with different names and several folders, also with desired names for source files in range of one folder, and it worked well. You had to wait approximately about 10 mins with frozen Bridge if you ran process for 6000 files.
Even if you had only to change every file to the same name (however you can't have in the same folder same named files) and then quickly opened metadata panel to paste that name in as well, you'd spend about 15 hours working with very rapid tempo, and without making even one second breaks.
If you had additionally to change names to decoded ones by some application translator (where you put encoded name to get decoded) then again pasted it to file and description field that had to take 30 hours. Doing it totally manually (having in brain all URI codes with their equivalents) probably 50 hours. When checking each URI character in dictionary before you remember them all meantime that could be 120 hours so about 5 days (including nights), and all without eating, sleeping and geting up from a chair, with hands constantly having on keyboard while head directed to buring your eyes screen 