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