2016-12-06 65 views

回答

2

你自己的答案只會改變一個字符,這裏是一個數組正則表達式的解決方案,你可以從$ 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

編輯除去從GET-ChildItem -File選擇,因爲它需要一個最近的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

任務也可以由Windows cmd腳本()完成 - 但是,除非實施適當的解決方法,否則存在一些限制。

下面的腳本替換#%&$,在文件名()。除^,!,=~之外,您可以添加更多的字符,但無法處理(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 
相關問題