1

I have the following batch file:

dir *.jpg /b /s >> out.txt

It outputs the path for all jpg file in the current directory to a text file, the problem is that the directory is not mine, but shared through network, and the path contains spanish special characters. So instead of outputting:

---------------v---------
...\Participación ciud...

It outputs

---------------v---------
...\Participaci¢n ciud...
  • 1
    I would check out the following http://stackoverflow.com/a/388500/2524589. Piecing these together it sounds like you run "chcp" to get your active code page in case you want to change it back, run "chcp 65001", run your dir command, and then run "chcp" with your original code page. I can't test this so I left it here in the comments. – KSib Sep 06 '16 at 15:49

1 Answers1

3

You should use CMD.exe with this option /U

/U     Output UNICODE characters (UCS-2 le)
          These options will affect piping or redirecting to a file.
          Most common text files are ANSI, use these switches
          when you need to convert the character set.

This code can did the trick to output the unicode characters :

@echo off
Set "TmpLogFile=%Tmp%\%~n0.txt"
Set "LogFile=%~dp0%~n0.txt"
If Exist "%TmpLogFile%" Del "%TmpLogFile%"
dir *.jpg /b /s >> %TmpLogFile%
REM Formatting the output to unicode
CMD /U /C Type "%TmpLogFile%" > "%LogFile%"
Start "" "%LogFile%"

For more options of CMD.exe /?

I used this trick in a more elaborate code like this one :

@ECHO OFF
Title Scan a folder and store all files names in an array variables
SET "ROOT=%userprofile%\Desktop\"
SET "EXT=jpg"
SET "Count=0"
Set "TmpLogFile=%Tmp%\%~n0.txt"
Set "LogFile=%~dp0%~n0.txt"
SETLOCAL enabledelayedexpansion
REM Iterates throw the files on this current folder and its subfolders.
REM And Populate the array with existent files in this folder and its subfolders
For %%a in (%EXT%) Do ( 
    Call :Scanning "*.%%a" & timeout /T 2 /Nobreak>nul
    FOR /f "delims=" %%f IN ('dir /b /s "%ROOT%\*.%%a"') DO (
        Call :Scanning "%%f"
        SET /a "Count+=1"
        set "list[!Count!]=%%~nxf"
        set "listpath[!Count!]=%%~dpFf"
    )
)
::***************************************************************
:Display_Results
cls & color 0B
echo wscript.echo Len("%ROOT%"^) + 20 >"%tmp%\length.vbs"
for /f %%a in ('Cscript /nologo "%tmp%\length.vbs"') do ( set "cols=%%a")
If %cols% LSS 50 set /a cols=%cols% + 15
set /a lines=%Count% + 10
Mode con cols=%cols% lines=%lines%
ECHO  ********************************************************
ECHO  Folder:"%ROOT%"
ECHO  ********************************************************
If Exist "%TmpLogFile%" Del "%TmpLogFile%"
rem Display array elements and save results into the TmpLogFile
for /L %%i in (1,1,%Count%) do (
    echo [%%i] : !list[%%i]!
    echo [%%i] : !list[%%i]! -- "!listpath[%%i]!" >> "%TmpLogFile%"     
)

( ECHO. & ECHO Total of [%EXT%] files(s^) : %Count% file(s^) )>> "%TmpLogFile%"
REM Formatting the TmpLogFile to the unicode LogFile :
CMD /U /C Type "%TmpLogFile%" > "%LogFile%"
ECHO(
ECHO Total of [%EXT%] files(s) : %Count% file(s)
echo(
echo    Type the number of file did you want to explore ?
set /p "Input="
For /L %%i in (1,1,%Count%) Do (
    If "%INPUT%" EQU "%%i" (
        Call :Explorer "!listpath[%%i]!"
    )
)   
Goto:Display_Results
::**************************************************************
:Scanning <file>
mode con cols=75 lines=3
Cls & Color 0E
echo(
echo Scanning for "%~1" ...
goto :eof
::*************************************************************
:Explorer <file>
explorer.exe /e,/select,"%~1"
Goto :EOF
::*************************************************************
Hackoo
  • 18,337
  • 3
  • 40
  • 70
  • That did the trick, thanks. BTW, what language are batch files in? I'd like to learn it as it can be extremely useful for optimizing workflows. – Miguel Bartelsman Sep 07 '16 at 12:06