如何用批处理文件替换所有文件和文件夹中的空格和符号
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
。这是有充分理由的关键。如果它无法 cd
或 pushd
,通常脚本将继续重命名,从它启动的工作目录,或之前的 cd
pushd
等。在这种情况下,如果找不到目录,或者没有权限,它将完全跳过脚本的其余部分。
最后的说明。如果您的文件或文件夹包含 !
,这将需要更改。然后,您可以简单地恢复为将 set
和 ren
移动到标签,然后将标签称为 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 脚本的轻微修改。基本上我最终完成了修改。
- 将所有内容更改为小写。
- 替换文件名中的空格和符号。
- 替换目录名称中的空格和符号。
我知道它是重复的,我想用更少的行来做,但它有效。
我认为我非常接近。我有一个文件夹,我正在尝试重命名所有子文件夹和文件,以便去除大写字母,将符号替换为适用的单词,并且 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
。这是有充分理由的关键。如果它无法 cd
或 pushd
,通常脚本将继续重命名,从它启动的工作目录,或之前的 cd
pushd
等。在这种情况下,如果找不到目录,或者没有权限,它将完全跳过脚本的其余部分。
最后的说明。如果您的文件或文件夹包含 !
,这将需要更改。然后,您可以简单地恢复为将 set
和 ren
移动到标签,然后将标签称为 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 脚本的轻微修改。基本上我最终完成了修改。
- 将所有内容更改为小写。
- 替换文件名中的空格和符号。
- 替换目录名称中的空格和符号。
我知道它是重复的,我想用更少的行来做,但它有效。