2017-01-03 3 views
0

У меня есть файл с именем - например: 01_XXXXXXXX_XXXX_XXX.txt.Заменить символы в имени файла через .bat

мне нужно вырезать первые три символа (заменить 01_ ничем) и заменить оставшиеся _ от Пробелы.

Я не могу использовать PowerShell, мне нужен простой файл .bat, чтобы перебрать все файлы в каталоге, где он присутствует, и выполнить эту задачу.

Так я использую это:

@echo off 
setlocal enabledelayedexpansion 
for %%a in (*_*) do (
    set file=%%a 
    ren "!file!" "!file:_= !" 
) 

@echo off 
setlocal enabledelayedexpansion 
set X=2 
for %%f in (*) do if %%f neq %~nx0 (
    set "filename=%%~nf" 
    set "filename=!filename:~%X%,-%X%!" 
    ren "%%f" "!filename!%%~xf" 
) 
popd 

Но ест два символа в конце перед расширением и добавление ПРОСТРАНСТВА в самом начале.

Любая идея, почему?

+3

Да это :) поиск Google, как обрезать первые х символов строки в пакетном режиме, а затем замена строки поиска google в пакете :) Для проверки цикла «For /?». – geisterfurz007

+2

Как и в стороне, почему у вас есть два '@echo off' и два оператора setlocal в одном файле и' popd' без 'pushd'? –

ответ

2

Вы раскалываете первые два и два последних символа, поскольку вы внедрили sub-string expansion syntax ошибочно. Ведущий SPACE происходит от первого _ до замены.

Ниже показан надежный способ сделать это, используя один цикл и sub-string replacement syntax только, в первый раз с * сразу после :, говоря интерпретатор командной строки, чтобы заменить все, вплоть до и включая первое вхождение строка поиска:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 
for %%A in ("*_*") do (
    rem // Store current item: 
    set "FILE=%%~A" 
    rem // Toggle delayed expansion to avoid loss of or trouble with `!`: 
    setlocal EnableDelayedExpansion 
    rem // Remove everything up to and including the first `_`: 
    set "FNEW=!FILE:*_=!" 
    rem // Replace every remaining `_` by ` `: 
    ren "!FILE!" "!FNEW:_= !" 
    endlocal 
) 
endlocal 
exit /B 
1

Если модель согласуется с 01_XXXXXXXX_XXXX_XXX.txt(т.е. нетребуемой строки, оканчивающаяся _ следует три необходимых строки, разделенных _), то один вкладыш, как это может быть достаточно:

из пакетного файла:

@For /F "Tokens=1-4 Delims=_" %%A In ('Where ?*_?*_?*_?*.txt') Do @If Not Exist "%%B %%C %%D" @Ren "%%A_%%B_%%C_%%D" "%%B %%C %%D" 

Из командной строки:

For /F "Tokens=1-4 Delims=_" %A In ('Where ?*_?*_?*_?*.txt') Do @If Not Exist "%B %C %D" @Ren "%A_%B_%C_%D" "%B %C %D" 
Смежные вопросы