Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 3202
  • Last Modified:

Remove special characters from multiple files batch script solution works on everything but '~'

We have a client who needs to rename thousands of files in order to upload them to SharePoint and many of those files contain tildes(~).

I have used the script suggested in the related question to replace many different characters in a filename, but it doesn't work on tildes even if it is preceded by a ^ to make it a literal.

Here's the script from the other response.  I modified it to allow a second parameter to pass in the desired character to replace.  Whether I use a parameter or the literal ^~, it doesn't work:

@echo off
 
setlocal ENABLEDELAYEDEXPANSION


if "%~1"=="" (
      echo # ERROR - supply the directory from which to begin the search for
      echo           filenames containing the ampersand symbol.  Any file
      echo           encountered with have the ampersand replaced by 'and'.
      goto :EOF
)
 
if not exist "%~1" (
      echo # ERROR - directory NOT found
      echo          = '%~1'
      goto :EOF
)
 
echo/
echo + Parsing "%~1", please wait ...
 
for /f "tokens=*" %%F in ('dir "%~1" /s/b') do (
      set fileNAME=%%F
      set newFILEname=!fileNAME:^%2= !
      if not "!newFILEname!"=="!fileNAME!" (
            for /f "tokens=*" %%N in ("!newFILENAME!") do (
                  echo   + renaming "!fileNAME!" to "!newFILEname!"
                  ren "!fileNAME!" "%%~nxN"
                  if not errorlevel 1 (
                        echo     - SUCCESS
                  ) else (
                        echo     # FAILED to rename "!fileNAME!"
                  )
            )
      )
)
 
echo - COMPLETE
0
cpgtechsupport
Asked:
cpgtechsupport
1 Solution
 
sungenwangCommented:
Not sure why it doesn't work with '~' in batch command. If you are willing to try running vbscript it is very simple to do. I have included the code to do it:

1. Copy the code into notepad
2. Change line 1, 2, and 3 to appropriate value (set it to a 'test' path first!)
3. Save the change to a file with a "vbs" extension.
4. Double-click the file to run it.

You can change the first 3 lines to replace different symbols. Beware as this code will also change files in sub-folders! Remove line 19-21 if you don't need that.

sew

strFolderName = "C:\temp"
strCharToFind = "~"
strCharToReplaceWith = "_tilda_"

Set objFSO = CreateObject("Scripting.FileSystemObject")

Call TraverseFolder(strFolderName)

Sub TraverseFolder(strFolderName)
	Set objCurrentFolder = objFSO.GetFolder(strFolderName)

	For Each objFile In objCurrentFolder.Files
		If InStr(objFile.name, strCharToFind) > 0 Then
			strNewName = Replace(objFile.name, strCharToFind, strCharToReplaceWith)
			objFSO.MoveFile objFile.ParentFolder & "\" & objFile.name, objFile.ParentFolder & "\" & strNewName
		End If
	Next

	For Each objFolder In objCurrentFolder.subFolders
		Call TraverseFolder(objFolder.ParentFolder & "\" & objFolder.name)
	Next
End Sub

msgbox "done"

Open in new window

0
 
AmazingTechCommented:
Instead of replacing the tilda with a space how about just removing the tilda?


@echo off
 
setlocal ENABLEDELAYEDEXPANSION


if "%~1"=="" (
      echo # ERROR - supply the directory from which to begin the search for
      echo           filenames containing the ampersand symbol.  Any file
      echo           encountered with have the ampersand replaced by 'and'.
      goto :EOF
)
 
if not exist "%~1" (
      echo # ERROR - directory NOT found
      echo          = '%~1'
      goto :EOF
)
 
echo/
echo + Parsing "%~1", please wait ...
 
for /f "tokens=*" %%F in ('dir "%~1" /s/b') do (
      echo %%F | find "%2"
      if not errorlevel 1 (
          for /f "tokens=1,2,3,4,5,6,7 delims=%2" %%G in ('echo %%~nxF') do (
              set newFILEname=%%G%%H%%I%%J%%K%%L%%M
              echo   + renaming "%%F" to "!newFILEname!"
              ren "%%F" "!newFILEname!"
              if not errorlevel 1 (
                  echo     - SUCCESS
              ) else (
                  echo     # FAILED to rename "!fileNAME!"
              )
          )
      )

)
 
echo - COMPLETE

Open in new window

0
 
Bill PrewCommented:
Here's a quick example of a way you can remove the unwanted ~ characters from a string in batch.

~bp
@echo off
set Test=Foo~Bar~Rest
echo [%Test%]
for /F "tokens=1-10* delims=~" %%A in ("%Test%") do set Test=%%A%%B%%C%%D%%E%%F%%G%%H%%I%%J
echo [%Test%]

Open in new window

0
Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
misterlupoCommented:
If you don't mind to use a 3rd party application try tr.exe from the GNU utilities for Win32  to remove unwanted characters from the stream.

C:\>set test=One~Two*Three-Four
C:\>echo %test%|tr -d "~"
OneTwo*Three-Four

C:\>echo %test%|tr -d "~*-"
OneTwoThreeFour



0
 
MAdSCommented:
Replace  
set newFILEname=!fileNAME:^%2= !
by
set newFILEname=%fileNAME:^%2= %
And you can pass only ~ as parameter (^~ is not necessary, but doesn't hurt either).

 
0
 
cpgtechsupportAuthor Commented:
Hi, thanks for the help all.  We ended up resolving the issue using the FileRenamer application.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now