如何清理在 .bat 脚本中作为参数提供的文件路径(back/forward 斜线)以避免语法错误
How to clean-up file paths (back/forward slashes) provided as arguments in a .bat script to avoid syntax errors
我有一个简单的 .bat 脚本,它使用 ren
重命名文件夹中的所有文件。输入参数是包含要重命名的文件的文件夹的路径。该脚本有时会出现 returns 语法错误,我们已将其追溯到以下事实:有时输入路径包含正斜杠、反斜杠或两者的混合(有时以双正斜杠开头)。我们希望通过允许该脚本接受任何这些类型的路径,并在调用 ren
命令之前将路径作为 .bat 脚本的一部分进行清理,从而使该脚本更加健壮。
所以我的问题是:在调用 ren
函数之前,是否有(一组)命令可以应用于文件路径参数(下例中的 %1
)会纠正所有 forward/backslashes 以保持一致并避免语法错误吗?我对 .bat 脚本没有太多经验,所以任何代码示例都会有所帮助。
@echo off
setlocal ENABLEDELAYEDEXPANSION
for %%F in (%1*.nc) do (
for /F "tokens=1-8 delims=_" %%a in ("%%~nF") do (
ren "%%F" "%%a_%%b_%%c_%%d_%%e_%%g_%%f_%%h.nc"
)
)
更新:最后,只需要 Magoo 的最后一个建议,因为将 %1
更改为 "%~f1"
解决了斜线问题。我还必须将 %~f1\
添加到 ren
命令的第一个参数,否则它会以某种方式查找错误的文件夹(第一个 for
发现文件正常,但 ren
命令在错误的文件夹中查找。
@echo off
setlocal ENABLEDELAYEDEXPANSION
for /F "delims=" %%F in ('dir /b /a-d "%~f1\*.nc"') do (
for /F "tokens=1-8 delims=_" %%a in ("%%~nF") do (
ren "%~f1\%%~nF.nc" "%%a_%%b_%%c_%%d_%%e_%%g_%%f_%%h.nc"
)
)
set "corrected=%~1"
set "corrected=%corrected:/=\%"
然后使用 %corrected%
代替 %1
AND quote the filename
因此:
for %%F in ("%corrected%*.nc") do (
如果 %1
始终是目录名,则添加
if "%corrected:~-1%" neq "\" set "corrected=%corrected%\"
作为 for
行之前的第三行 set
。
第一个 set
将 %1
的值赋给一个变量 corrected
- ~
删除了所有括起来的引号。
第二个 set
将所有匹配 :
和 =
之间的字符串更改为给定变量中的 =
和 %
之间的字符串,并且分配给第一个提到的变量(可以是同一个变量,如本例)
第三个 set
,如果使用,检查最后一个字符是否为 \
,如果不是,则附加一个 \
.
文件名字符串的引号允许 path/filename 中有空格,如果没有空格则无害。
为了避免尝试重命名文件两次,而不是
for %%F in ("%corrected%*.nc") do (
使用
for /F "delims=" %%F in ('dir /b /a-d "%corrected%*.nc"') do (
这会在内存中构建文件名列表,然后处理该列表。
我有一个简单的 .bat 脚本,它使用 ren
重命名文件夹中的所有文件。输入参数是包含要重命名的文件的文件夹的路径。该脚本有时会出现 returns 语法错误,我们已将其追溯到以下事实:有时输入路径包含正斜杠、反斜杠或两者的混合(有时以双正斜杠开头)。我们希望通过允许该脚本接受任何这些类型的路径,并在调用 ren
命令之前将路径作为 .bat 脚本的一部分进行清理,从而使该脚本更加健壮。
所以我的问题是:在调用 ren
函数之前,是否有(一组)命令可以应用于文件路径参数(下例中的 %1
)会纠正所有 forward/backslashes 以保持一致并避免语法错误吗?我对 .bat 脚本没有太多经验,所以任何代码示例都会有所帮助。
@echo off
setlocal ENABLEDELAYEDEXPANSION
for %%F in (%1*.nc) do (
for /F "tokens=1-8 delims=_" %%a in ("%%~nF") do (
ren "%%F" "%%a_%%b_%%c_%%d_%%e_%%g_%%f_%%h.nc"
)
)
更新:最后,只需要 Magoo 的最后一个建议,因为将 %1
更改为 "%~f1"
解决了斜线问题。我还必须将 %~f1\
添加到 ren
命令的第一个参数,否则它会以某种方式查找错误的文件夹(第一个 for
发现文件正常,但 ren
命令在错误的文件夹中查找。
@echo off
setlocal ENABLEDELAYEDEXPANSION
for /F "delims=" %%F in ('dir /b /a-d "%~f1\*.nc"') do (
for /F "tokens=1-8 delims=_" %%a in ("%%~nF") do (
ren "%~f1\%%~nF.nc" "%%a_%%b_%%c_%%d_%%e_%%g_%%f_%%h.nc"
)
)
set "corrected=%~1"
set "corrected=%corrected:/=\%"
然后使用 %corrected%
代替 %1
AND quote the filename
因此:
for %%F in ("%corrected%*.nc") do (
如果 %1
始终是目录名,则添加
if "%corrected:~-1%" neq "\" set "corrected=%corrected%\"
作为 for
行之前的第三行 set
。
第一个 set
将 %1
的值赋给一个变量 corrected
- ~
删除了所有括起来的引号。
第二个 set
将所有匹配 :
和 =
之间的字符串更改为给定变量中的 =
和 %
之间的字符串,并且分配给第一个提到的变量(可以是同一个变量,如本例)
第三个 set
,如果使用,检查最后一个字符是否为 \
,如果不是,则附加一个 \
.
文件名字符串的引号允许 path/filename 中有空格,如果没有空格则无害。
为了避免尝试重命名文件两次,而不是
for %%F in ("%corrected%*.nc") do (
使用
for /F "delims=" %%F in ('dir /b /a-d "%corrected%*.nc"') do (
这会在内存中构建文件名列表,然后处理该列表。