如何替换文件名中的特殊字符

时间:2015-02-02 22:26:57

标签: powershell batch-file replace filenames

我们正在迁移到OneDrive for Business。要在OneDrive中存储文件,您不能在文件名中包含以下字符: ?/:*“<> |#% 此外,不支持以波浪号(〜)开头的文件名。 我想用短划线搜索并替换特殊字符。 任何人都有批处理文件或powershell脚本?

1 个答案:

答案 0 :(得分:2)

巧合的是,Windows文件名中也不允许\ / : * ? " < > |,因此您的大多数列表都不是问题。假设字符列表已完成,剩下的就是哈希,百分比和前导波形。

@echo off
setlocal

:: replace ~ only if first char of filename
for %%I in ("~*") do (
    set "file=%%~I"
    setlocal enabledelayedexpansion
    echo %%~I -^> -!file:~1!
    ren "%%~I" "-!file:~1!"
    endlocal
)

:: replace # or % everywhere in filename
for %%d in (# %%) do (
    for %%I in ("*%%d*") do (
        set "file=%%~I"
        setlocal enabledelayedexpansion
        echo %%~I -^> !file:%%d=-!
        ren "%%~I" "!file:%%d=-!"
        endlocal
    )
)

但正如Dour指出的那样,这只能解决一些问题。您的文件上传might still require some hand-holding。或谁知道?这可以解决你所有的世俗问题。 耸肩


编辑:O.P。询问如何将/r添加到for循环中,以便对替换进行递归。你可以通过一些调整 来做到这一点,但是你最终会在文件列表中循环3次 - 对于你要替换的每个符号一次。我建议这是一种更有效的方法:

@echo off
setlocal enabledelayedexpansion

if "%~1"=="" goto usage
if not exist "%~1" goto usage
pushd "%~1"

for /r %%I in (*) do (
    set "file=%%~nxI"
    if "!file:~0,1!"=="~" (
        set "file=-!file:~1!"
    )
    for %%d in (# %%) do (
        if not "!file!"=="!file:%%d=!" (
            set "file=!file:%%d=-!"
        )
    )
    if not "!file!"=="%%~nxI" (
        echo %%~fI -^> !file!
        ren "%%~fI" "!file!"
    )
)

goto :EOF

:usage
echo Usage: %~nx0 pathname
echo To operate on the current directory, use a dot as the pathname.
echo Example: %~nx0 .

编辑2:添加了参数语法。