如何用批处理文件替换所有文件和文件夹中的空格和符号

How do I replace spaces and symbols in all files and FOLDERS with a batch file

我认为我非常接近。我有一个文件夹,我正在尝试重命名所有子文件夹和文件,以便去除大写字母,将符号替换为适用的单词,并且 spaces 在文件及其父子中更改为连字符 -文件夹。

这是我目前拥有的批处理文件:

cd d:\scripts\testing\
for /r %%D in (.) do @for /f "eol=: delims=" %%F in ('dir /l/b "%%D"') do @ren "%%D\%%F" "%%F"
SET location=d:\scripts\testing\
for /R %location% %%A in (*.*) do call :replspace "%%A"
for /R %location% %%A in (*.*) do call :repland "%%A"
goto :eof 

:replspace
set "_fn=%~nx1"
ren %1 "%_fn: =-%"

:repland
set "_fn=%~nx1"
ren %1 "%_fn:&=and%"

正如您可能看到的那样,它首先遍历并将 d:\scripts\testing\ 中的所有内容(文件和文件夹)重命名为小写。接下来它重命名同一目录中的所有文件,用连字符替换 spaces,用单词“and”替换“&”。这一切都有效...除了我需要做相同的符号和 space 更改文件夹,我没有找到任何关于如何做到这一点的真实信息。

有人有什么建议吗?

顺便说一句,这在服务器 2012 r2 上运行,但是由于互操作性问题,脚本必须是老式的批处理脚本。

你可以用一个for循环完成整个替换任务。,通过使用dir /s递归搜索目录。

@echo off
setlocal enabledelayedexpansion
pushd "d:\scripts\testing\" || goto :EOF
for /f "delims=" %%i in ('dir /b /l /s') do (
    set "item=%%~i"
    set "item=!item:%%~dpi=!"
    set "item=!item: =-!"
    ren "%%~fi" "!item:&=and!"
)
popd

我没有 set& 替换作为变量,因为只完成了两个替换,所以简单地使用最后一项的替换是有意义的,而不需要 set 再次。如果您要添加更多替换项,请在 ren 行之前添加它们:

注意此示例仅echo结果用于测试目的。只有在确信结果符合预期后才删除 echo

然后,注意pushd语句中的|| goto :EOF。这是有充分理由的关键。如果它无法 cdpushd,通常脚本将继续重命名,从它启动的工作目录,或之前的 cd pushd 等。在这种情况下,如果找不到目录,或者没有权限,它将完全跳过脚本的其余部分。

最后的说明。如果您的文件或文件夹包含 !,这将需要更改。然后,您可以简单地恢复为将 setren 移动到标签,然后将标签称为 delayedexpansion 将导致 ! 丢失。

虽然 Gerhard 的脚本很干净并且应该可以运行,但在某些情况下它会自行跳闸,就像我的一样。我最终使用了这个脚本:

rem #### Step 1: move to working directory ####
cd "d:\scripts\testing\"

rem #### Step 2: change case on everything ####
for /r %%D in (.) do @for /f "eol=: delims=" %%F in ('dir /l/b "%%D"') do @ren "%%D\%%F" "%%F"

rem #### Step 3: set location ####
SET location=d:\scripts\testing\
for /R %location% %%A in (*.*) do call :replspace "%%A"
for /R %location% %%A in (*.*) do call :repland "%%A"

rem #### Step 4: replace spaces/symbols on directories ####
setlocal enabledelayedexpansion
pushd "D:\scripts\testing\" || goto :EOF
for /f "delims=" %%i in ('dir /l /b /s /ad') do (
    set "item=%%~i" 
    set "item=!item: =-!"
    move "%%~fi" "!item:&=and!"
)
popd

rem #### variables ####

:replspace
set "_fn=%~nx1"
ren %1 "%_fn: =-%"

:repland
set "_fn=%~nx1"
ren %1 "%_fn:&=and%"

它结合了我自己的脚本和对 Gerhard 脚本的轻微修改。基本上我最终完成了修改。

  1. 将所有内容更改为小写。
  2. 替换文件名中的空格和符号。
  3. 替换目录名称中的空格和符号。

我知道它是重复的,我想用更少的行来做,但它有效。