2016-12-06 2 views
1

Как изменить символ (#,%, &, $) в имени файла из нескольких файлов в одной папке и его подпапках?Заменить определенные символы из имен файлов во всех файлах в папке и его подпапках

Ravi Thapliyal ответит, как это сделать с PowerShell, но только для файлов в определенной папке (Replace or delete certain characters from filenames of all files in a folder).

Мне нужно обобщить это для всех файлов во всех папках в выбранном.

ответ

2

Ваш собственный ответ изменит только один символ, вот решение с массивом RegEx за один раз, удалите символы, которые вы хотите сохранить от $ replace.

[char[]]$replace = '[email protected]#$%^&*(){}[]":;,<>/|\+=`~ ''' 
$regex = ($replace | % {[regex]::Escape($_)}) -join '|' 

Get-ChildItem -recurse | 
    ForEach { 
    if ($_.Name -match $RegEx){ 
     Ren $_.Fullname -NewName $($_.Name -replace $RegEx, '_') -whatif 
    } 
    } 

Если выход выглядит нормально, удалите -whatif

Редактировать удален -File вариант из Get-ChildItem, как это требует последнюю версию Powershell и не было необходимости.

Edit2 Я регулярно заявляют, что Rename-Item принимает поточный ввод, поэтому здесь более прямой вариант:

[char[]]$replace = '[email protected]#$%^&*(){}[]":;,<>/|\+=`~ ''' 
$regex = ($replace | % {[regex]::Escape($_)}) -join '|' 
Get-ChildItem -recurse | 
    Where-Object { $_.Name -match $RegEx} | 
    Rename-Item -NewName {$_.Name -replace $RegEx, '_'} -whatif 
+0

работает идеально, после удаления -whatif – Mario

0

Я нашел this answerDustin Malone из:

Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace(" ", "_") } 

Это дает ошибку, но сделать трюк.

0

Задача также может быть достигнуто с помощью cmd сценария Windows () - однако существуют некоторые ограничения, если не будут выполнены соответствующие рабочие условия.

Следующий скрипт заменяет #, %, &, $, ( и ) в именах файлов. Вы можете добавить больше символов, кроме ^, !, = и ~, которые не могут быть обработаны (запрос if позволяет пропустить замену, чтобы избежать ошибок синтаксиса). Если вы указываете символы с кодом больше 127 = 0x7F, вам, вероятно, потребуется скорректировать код страницы (см. Команду chcp).Обратите внимание, что скрипт не переименовывать файлы, но только отображает их, , пока вы не удалите верхний регистр ECHO команда:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "_ROOT=D:\path\to\root\dir" & rem /* (assign `%~1` here instead for the script to 
            rem accept the root dir. as command line argument) */ 
set _CHAR="#" "%%" "&" "$" "(" ")" & rem // (a `%` sign needs to be doubled!) 
set "_REPL=_" & rem // (replacement character or string; this may also be empty) 

if not defined _ROOT set "_ROOT=." 
for /R "%_ROOT%" %%F in ("*.*") do (
    set "FILE=%%~F" 
    set "NAME=%%~nxF" 
    setlocal EnableDelayedExpansion 
    for %%C in (!_CHAR!) do (
     if not "%%~C"=="^" if not "%%~C"=="!" if not "%%~C"=="=" if not "%%~C"=="~" (
      set "NAME=!NAME:%%~C=%_REPL%!" 
     ) 
    ) 
    ECHO ren "!FILE!" "!NAME!" 
    endlocal 
) 

endlocal 
exit /B 

Для замены также персонажам ^ и !, потребности сценария быть продлен немного:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "_ROOT=D:\path\to\root\dir" & rem /* (assign `%~1` here instead for the script to 
            rem accept the root dir. as command line argument) */ 
set _CHAR="#" "%%" "&" "$" "(" ")" "^" "!" & rem // (a `%` sign needs to be doubled!) 
set "_REPL=_" & rem // (replacement character or string; this may also be empty) 

if not defined _ROOT set "_ROOT=." 
for /R "%_ROOT%" %%F in ("*.*") do (
    set "FILE=%%~F" 
    set "NAME=%%~nxF" 
    setlocal EnableDelayedExpansion 
    for %%C in (!_CHAR!) do (
     if "%%~C"=="^" (
      set "NAME=!NAME:^=^^!" 
      call set "NAME=%%NAME:^=%_REPL%%%" 
     ) else if "%%~C"=="!" (
      call set "NAME=%%NAME:^!=%_REPL%%%" 
     ) else if not "%%~C"=="=" if not "%%~C"=="~" (
      set "NAME=!NAME:%%~C=%_REPL%!" 
     ) 
    ) 
    ECHO ren "!FILE!" "!NAME!" 
    endlocal 
) 

endlocal 
exit /B 

Для того, чтобы заменить также символы = и ~, сценарий должен быть продлен гораздо больше:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "_ROOT=D:\path\to\root\dir" & rem /* (assign `%~1` here instead for the script to 
            rem accept the root dir. as command line argument) */ 
set _CHAR="#" "%%" "&" "$" "(" ")" "^" "!" "=" "~" & rem // (a `%` sign needs to be doubled!) 
set "_REPL=_" & rem // (replacement character or string; this may also be empty) 

set "$LEN=" 
if not defined _ROOT set "_ROOT=." 
for /R "%_ROOT%" %%F in ("*.*") do (
    set "FILE=%%~F" 
    set "NAME=%%~nxF" 
    setlocal EnableDelayedExpansion 
    for %%C in (!_CHAR!) do (
     if "%%~C"=="^" (
      set "NAME=!NAME:^=^^!" 
      call set "NAME=%%NAME:^=%_REPL%%%" 
     ) else if "%%~C"=="!" (
      call set "NAME=%%NAME:^!=%_REPL%%%" 
     ) else if "%%~C"=="~" (
      call :FAST NAME NAME "%%~C" "%_REPL%" 
     ) else if "%%~C"=="=" (
      call :SLOW NAME NAME "%%~C" "%_REPL%" 
     ) else (
      set "NAME=!NAME:%%~C=%_REPL%!" 
     ) 
    ) 
    ECHO ren "!FILE!" "!NAME!" 
    endlocal 
) 

endlocal 
exit /B 


:FAST rtn_string ref_string val_char val_repl 
rem // This works for `~` and `*`, but NOT for `=`! 
setlocal DisableDelayedExpansion 
set "STR=" 
set "CHR=%~3" 
if not defined CHR goto :FQUIT 
setlocal EnableDelayedExpansion 
set "CHR=!CHR:~,1!" 
set "STR=!%~2!" 
:FLOOP 
if defined STR (
    set "END=!STR:*%~3=!" 
    if not "!END!"=="!STR!" (
     for /F "eol=%CHR% delims=%CHR%" %%L in ("!STR!") do (
      for /F "delims=" %%K in (^""!END!"^") do (
       endlocal 
       set "STR=%%L%~4%%~K" 
       setlocal EnableDelayedExpansion 
      ) 
     ) 
     goto :FLOOP 
    ) 
) 
:FQUIT 
for /F "delims=" %%K in (^""!STR!"^") do (
    endlocal 
    set "STR=%%~K" 
) 
endlocal & set "%~1=%STR%" 
exit /B 


:SLOW rtn_string ref_string val_char val_repl 
rem // This works even for `=`. 
setlocal DisableDelayedExpansion 
set "STR=" 
set "CHR=%~3" 
set "RPL=%~4" 
if not defined CHR goto :SQUIT 
if not defined $LEN call :LEN $LEN RPL 
setlocal EnableDelayedExpansion 
set "CHR=!CHR:~,1!" 
set "STR=!%~2!" 
set /A "IDX=0" 
:SLOOP 
set /A "NXT=IDX+1" 
if defined STR (
    set "POS=!STR:~%IDX%,1!" 
    if defined POS (
     if "!POS!"=="!CHR!" (
      set "STR=!STR:~,%IDX%!!RPL!!STR:~%NXT%!" 
      set /A "NXT=IDX+$LEN" 
     ) 
     set /A "IDX=NXT" 
     goto :SLOOP 
    ) 
) 
:SQUIT 
for /F "delims=" %%K in (^""!STR!"^") do (
    endlocal 
    set "STR=%%~K" 
    set "$LEN=%$LEN%" 
) 
endlocal & set "%~1=%STR%" & set "$LEN=%$LEN%" 
exit /B 


:LEN rtn_length ref_string 
setlocal EnableDelayedExpansion 
set "STR=!%~2!" 
if not defined STR (set /A LEN=0) else (set /A LEN=1) 
for %%L in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
    if defined STR (
     set "INT=!STR:~%%L!" 
     if not "!INT!"=="" set /A LEN+=%%L & set "STR=!INT!" 
    ) 
) 
endlocal & set "%~1=%LEN%" 
exit /B 
Смежные вопросы