2016-12-06 2 views
1

Comment puis-je modifier certains caractères (#,%, &, $) dans le nom de fichier de plusieurs fichiers dans un dossier et ses sous-dossiers?Remplacer certains caractères des noms de fichier dans tous les fichiers d'un dossier et ses sous-dossiers

Ravi Thapliyal répondez comment faire cela avec PowerShell mais seulement pour les fichiers dans un dossier spécifique (Replace or delete certain characters from filenames of all files in a folder).

J'ai besoin de généraliser que pour tous les fichiers dans tous les dossiers de celui sélectionné.

Répondre

2

Votre propre réponse ne changera un char, voici une solution avec un tableau RegEx en une seule fois, retirez les caractères que vous souhaitez conserver de $ remplacer.

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

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

Si la sortie semble ok, retirez le -whatif

Modifier Suppression de l'option -File de Get-ChildItem car elle nécessite une version récente Powershell et n'a pas été nécessaire.

Edit2 je déclare régulièrement que Rename-Item accepte l'entrée redirigée, alors voici une version plus avant droit:

[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

fonctionne parfaitement, après avoir enlevé -whatif – Mario

0

Je trouve this answer de Dustin Malone:

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

Il donne une erreur, mais l'affaire.

0

La tâche peut également être accomplie par un script Windows cmd () - cependant, il existe certaines limites, à moins que soient mises en œuvre appropriées contournements.

Le script suivant remplace #, %, &, $, ( et ) dans les noms de fichiers. Vous pouvez ajouter plus de caractères sauf ^, !, = et ~, qui ne peuvent pas être traités (une requête if permet de sauter le remplacement afin d'éviter les erreurs de syntaxe). Si vous fournissez des caractères avec un code supérieur à 127 = 0x7F, vous pouvez probablement besoin de changer la page de code appropriée (voir la commande chcp).Notez que le script ne renomme pas les fichiers mais ne les affiche, jusqu'à ce que vous supprimez la commande majuscules 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 

Pour remplacer également les caractères ^ et !, les besoins de script être étendue un peu:

@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 

Pour remplacer également les caractères = et ~, le script doit être étendue beaucoup plus:

@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