rename - Renaming a file using a batch program in Vista/7. Problem with administrator access

30
2014-06
  • Questioner

    I have a batch file that renames a file in a folder using:

    rename filename.exe filename.bac
    

    This works good in Win XP. But in Vista/7, if the batch file is run under Program Files/ it does not rename the file unless I run it as administrator. Is there any way to bypass the UAC and use this without the need to run it as administrator?

    thanks.

  • Answers
  • nhinkle

    If you ever worked with linux you'll note that even when you are an administrator you don't get to do everything you want without elevation. The same concept applies to UAC. Even if you are logged in as an administrator, you run with standard user privileges by default. So no, you can't just make changes to system files (like the program files directory) - that's exactly what UAC is there to prevent.

    You can disable uac if you really want to, but this is a potential security risk.

  • nhinkle

    Modifying folders and files in the program files directory requires elevation, even if you are logged in as an administrator. There are a few potential solutions to your problem:

    • Always elevate the batch file when you run it. If it is being used as a scheduled task, you can check the box for Run this task with highest privileges.

    • Use the Windows Vista/7 Elevation powertoy script to elevate just that command

    • Change the permissions in that specific subdirectory of program files to allow normal users to rename files

      To do this, go to the directory with the file you will be renaming. Right-click on the folder and click on Properties. Go to the security tab. Click advanced and then Change Permissions. Click Add and choose the account which will be running the batch file. Grant that account the necessary permissions - probably create files and delete files at a minimum. Then click OK however many times you need to dismiss all the dialogs. The specified account will now be able to modify files in that folder without needing to elevate.

    • Disable UAC. This is not recommended, as it leaves your system vulnerable

  • Richie086

    Take a look at the elevate tool

    http://technet.microsoft.com/en-us/magazine/2007.06.utilityspotlight.aspx

    I have used this tool to run various batch files that normally require running in an administrator prompt. It turns out that if you pass the verb "runas" to either the ShellExecute API or to its COM equivalent, the ShellExecute method of Shell.Application, the application launched will prompt for elevation This tool (which consists of the files ElevateCommand.inf, elevate.cmd, and elevate.vbs) adds an elevate command to your system. This lets you launch applications that prompt for elevation from the command line, a script, or the Run dialog. For example, the following command opens Win.ini with Notepad (after prompting for elevation):

    elevate notepad c:\Windows\Win.ini
    

    When using the elevate command with Windows Script Host (WSH), Windows PowerShell™ or other scripts, you need to specify the script host executable (such as wscript, cscript, or powershell) as the application. To run a vbs, for example, you’d use this:

    elevate wscript “C:\windows\system32\slmgr.vbs” –dli
    

    The help text explains this. Use elevate with -? or with no parameters to see the help text.

    The next irritant was that there was no "Run as Administrator" context menu option (when you right-click on the file in Explorer) for most Windows script types. The one exception was for command-shell scripts (those with .bat and .cmd file extensions). So I set out to investigate this. Many of the context menu options for file types are controlled through command keys for the "object" type in the HKEY_CLASSES_ROOT section of the Registry (see Verbs and File Associations in the sidebar for details). It turns out that if that command key is named runas, the command invoked will prompt for elevation.

    Elevate HTML Application PowerToy (ElevateHTA.inf)

    Elevate Windows PowerShell Script PowerToy (ElevatePowerShellScript.inf)

    Elevate WSH Script PowerToy (ElevateWSHScript.inf, elevate.cmd, elevate.vbs)

    These PowerToys add a Run as Administrator Explorer context menu entry for HTAs, Windows PowerShell, and Windows Script Host file types respectively. ElevateWSHScript.inf also adds a Run as Administrator with Command Prompt menu entry. (Please read the note in ElevatePowerShellScript.inf before installing it.)

    Be sure to extract the power toy into c:\Windows\System32, or if you put the tool elsewhere add the directory to you $PATH variable so you can call it inside of batch scripts easily.


  • Related Question

    How to batch rename files copied from OSX to Windows with ':' in filenames?
  • tputkonen

    This is really puzzling. I have lots of videos that were stored using Mac OS, and now I have to edit them on Windows XP. I copied files using HFSExplorer. Editing software refuses to open the files with their current names, and so far I have not found a way to batch rename all the files.

    Names of the files look like this:

    clip-2009-10-01 21;26;00.mov

    But I suspect in OSX the time was 21:26:00.

    I would like to replace the space with an underscore, and semicolons with dash.

    I've tried several bulk rename applications, with ; and :, but in vain. Also I've tried rename.pl, but also in vain.


  • Related Answers
  • quack quixote

    Updated:

    We're under the assumption that "clip-2009-10-01 21;26;00.mov" is not the actual filename; one possibility is that the actual filename is "clip-2009-10-01 21:26:00.mov". However, we can't verify that under Windows.

    We may not need to.


    Failsafe Method:

    Boot to a Linux LiveCD. Ubuntu 9.04 has good NTFS support, and Linux handles a lot more wonky-characters-in-filenames than Windows. The perl rename script may be included as the system's rename command.


    This-Might-Actually-Work Batch Method (New Script!)

    The DOS command DIR/X shows short filenames, if they exist on your system.

    $ cmd
    c:\test> dir /x
     Volume in drive E is NUVOL
     Volume Serial Number is 80D3-A96D
    
     Directory of e:\tor\test
    
    10/04/2009  05:15 AM    <DIR>                       .
    10/04/2009  05:15 AM    <DIR>                       ..
    10/04/2009  05:11 AM                 0 CLIP-2~1.MOV clip-2009-10-01 21;26;00.mov
                   1 File(s)              0 bytes
                   2 Dir(s)   5,201,670,144 bytes free
    

    If they do exist, the REN command will move them to a new name; the new name can be a new (valid) long filename.

    c:\test> ren CLIP-2~1.MOV "clip-2009-10-01_21-26-00.mov"
    

    That's how to fix one.

    To batch process all of them, you need to 1) grab a listing of all the files you want to move; 2) run a short perl script to convert your listing into a batch file with the appropriate REN commands; and 3) run the resulting batch script.

    c:\test> dir /x > mybrokenfiles.lst  
    $ cat mybrokenfiles.lst | perl -lne 'next if not /MOV/; s/^.{1,39}//; s/^/ren /; s/ (\d\d);(\d\d);(\d\d)/_$1-$2-$3/; print' > fixmybrokenfiles.bat  
    c:\test> fixmybrokenfiles.bat
    

    The perl commandline assumes a very particular input format, so if the DOS listing shows long filenames in something other than the "21;26;00.mov" format, it probably won't do exactly what you want. If you try it, double-check that the batch script looks right before running it.

    If you are comfortable with perl (or sed/awk, python, whatever), you can script this yourself. But if DIR/X doesn't show the short filenames, your system has them disabled, and this solution won't help.


    Original answer: not useful with what we know now, but if you copy this sort of file off of OSX again, you can use this BEFORE the copy as a preventative step.

    I use the commandline a lot on both Windows and Linux systems. There's a handy perl script floating around the internet that allows batch file renames using standard perl regex's (google for rename.pl to find it).

    Under Cygwin on windows, use this in the directory your files are located in to rename them:

    $ ls
    clip-2009-10-01 21;26;00.mov
    
    $ rename.pl 'tr/ ;/_-/;' * 
    $ ls
    clip-2009-10-01_21-26-00.mov
    

    Pretty sure my version came from the Perl Cookbook:

    #!/usr/bin/perl -w
    # rename - Larry's filename fixer
    $op = shift or die "Usage: rename expr [files]\n";
    chomp(@ARGV = <STDIN>) unless @ARGV;
    for (@ARGV) {
        $was = $_;
        eval $op;
        die $@ if $@;
        rename($was,$_) unless $was eq $_;
    }
    
  • 8088

    Check out Rename Master, it has a myriad of ways to manipulate filenames in batch. You'll want to check out the replace tab.

    alt text

    Rename Master is freeware.

  • 8088

    Lupas Rename is a FREEWARE program developed to rename a big number of files. It works on Win95, Win98, WinME, WinNT, Win2K and WinXP. It is a simple .EXE file and doesn't need any other external libraries.

    Here are some of the features :

    • Rename files and folders
    • Rename files in recursive subdirectories
    • Shell Integration (right click on a folder in the explorer to start LupasRename on these folder)
    • Instant Preview (Optional)
    • Undo the last rename operation
    • Make a Batch file to rename from a DOS Console
    • Make a Batch file for UNDO operation from a DOS Console
    • Save and Load your options into an INI File
    • Filter by any masks: .mp3;.mp2 or ???a*.txt...
    • Replace a substring by other with Matchcase Optional
    • Replace a substring by other with Matchcase Optional in Extension

    alt text

  • Simon Sheehan

    Just do this in mac or linux. This will rename all files and folders with a : to a -

    find . -depth -exec rename 's/:/-/g' * {}\;
    
  • T. Kaltnekar

    Total commander includes a batch renaming tool named Multi-Rename Tool (default shortcut is Ctrl+M).

    In your case you can rename the files by running process twice, once to replace space and once to replace semicolon.

    Other way is to use rename mask - select range before space, add underscore, then range after the space, while replacing semi colon with dash using Search and replace.

  • Bonus

    Similar to a couiple of the other solutions, Bulk Rename Utility is a utility that'll do the job. I find it very useful and easy to use for my bulk file re-naming needs.

  • MDMarra

    What are the permissions on the file? Are you sure you have permission to rename them? If not, take ownership of the files and try again.

  • 8088

    Interesting problem.

    You can write your own custom script. Here is one script that will work. It will REPLACE ALL COLONS, SEMICOLONS, SPACES WITH UNDERSCORE. I will assume the files are in E:/ and the names follow the pattern of clip*.mov. You can change this values in the script to your correct values. You can customize the script even further, if you wish.

    # Script Mac2WindowsFileTransfer.txt
    # Go to directory where files are stored.
    cd "E:/"                                     ### CHANGE THIS TO YOUR CORRECT VALUE. ###
    # Get a list of clip*.mov files.
    var str list ; lf -rng "clip*.mov" > $list   ### CHANGE THIS TO YOUR CORRECT VALUE. ###
    # Go thru files one by one.
    while ($list <> "")
    do
        # Get the next file.
        var str file
        lex "1" $list > $file
        # Create the new name.
        var str newname
        stex -p "^/^l[" $file > $newname
        # REPLACE ALL COLONS, SEMICOLONS,  SPACES WITH UNDERSCORE.
        while ( { sen -r "^(\:\; )^" $newname } > 0 )
            sal -r "^(\:\; )^" "_" $newname
        # Rename file.
        system rename ("\""+$file+"\"") $newname
    done
    

    Save the script as C:/Scripts/Mac2WindowsFileTransfer.txt. The script is in biterscripting ( http://www.biterscripting.com ). You can download biterscripting free. Run the by typing the following command in biterscripting.

    script "C:/Scripts/Mac2WindowsFileTransfer.txt"
    

    Patrick

  • 8088

    Myself, I like @~quack's answer. +1.

    But, for posterity, here's what I was going to post.

    I've been using StExBar in Stefan's Tools for a good while now. It adds a toolbar to the Windows Explorer with several handy functions.

    http://tools.tortoisesvn.net/

    (He has several tools, but this specific one is StExBar)

    You can accomplish your requested rename with two simple commands. Here's a screenshot of the first, which shows you a preview of the files being renamed, and what they will be renamed.

    enter image description here

  • 8088

    Under the assumption that the file-names contain weird and invisible characters, the way to proceed is to use DOS names of the old 8.3 format. To find out these names use the -x parameter:

    image

    Now use the short name to rename the file:

    ren CLIP-2~1.MOV "clip-2009-10-01_21_26_00.mov"
    

    If you use copy-paste to rename the file, be careful not to propagate the weird characters, so don't leave blank characters in the new name (because they might not really be blank).