重命名文件夹和子文件夹中的所有文件和文件夹

时间:2014-09-08 15:47:00

标签: windows powershell batch-file

我需要重命名整个文件结构,并找到某个字符串,如“_foo”,并将其重命名为“”。结构将如下: something_foo-> multiples_folders_and_files_foo-> multiples_folders_and_files_foo-> files_foo

每个文件夹中的所有文件和每个文件夹中的每个文件夹不得包含字符串“_foo”。

我在windows下工作。我尝试过powershell脚本,我能够重命名一个文件夹,但不能递归重命名所有文件夹。

谢谢你们!

3 个答案:

答案 0 :(得分:0)

@echo off
setlocal
set "string_to_remove=_foo"
set "root_dir=c:\root"

pushd "%root_dir%"

setlocal enableDelayedExpansion

    for  %%f in (*) do (
        set "file_name=%%f"
        ren "!file_name!" "!file_name:%string_to_remove%=!"

    )


for /r /d %%# in (*) do ( 
    set "dir_name=%%#"
    pushd "%%#"
    for  %%f in (*) do (
        set "file_name=%%f"
        ren "!file_name!" "!file_name:%string_to_remove%=!"

    )
    popd 
    if "!dir_name!" NEQ "!dir_name:%string_to_remove%=!" move  "!dir_name!" "!dir_name:%string_to_remove%=!"
)
popd
endlocal

答案 1 :(得分:0)

未经测试但请尝试此操作(在PowerShell中)

PS> ls -rec -path $path |  Ren -new { $_.name -replace '_foo' } -passthru

如果工作删除 - passthru切换

编辑:  如果名称末尾的“_foo”,您可以更改表达式:

|  Ren -new { $_.basename -replace '_foo$' } -ea silentlycontinue

编辑:

更强大的代码:(感谢TheMadTechnician)

PS> GCI $path -filter '*_foo*' -rec |  Ren -new { $_.name -replace '_foo' } -passthru

答案 2 :(得分:0)

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "remove=_foo"

    for /f "delims=" %%a in ('dir /s /b "*%remove%*.*" 2^>nul ^| sort /r') do (
        set "name=%%~nxa"
        setlocal enabledelayedexpansion
        for %%b in ("!name:%remove%=!") do endlocal & echo ren "%%~fa" "%%~b"
    )

这将枚举所有匹配的文件/文件夹,按相反顺序排序(因此文件在包含它们的文件夹之前处理),并为每个文件/文件夹删除指示的字符串

重命名操作仅响应控制台。如果输出正确,请删除echo命令