如何清理在 .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 (

这会在内存中构建文件名列表,然后处理该列表。