删除 .bat 文件中的一段文件名
Remove piece of filename in .bat file
我正在尝试使用 .bat 脚本重命名文件夹中的一堆文件。
原文件名:
S2A_MSIL2A_20200322T184031_N0214_R070_T11UPA_20200322T225116_A03.nc
粗体部分(第二个 date/time)是我要删除的部分
目标文件名:
S2A_MSIL2A_20200322T184031_N0214_R070_T11UPA_A03.nc
我试过这个:
rename "S??_??????_???????????????_?????_????_??????_???????????????_???.nc" "S??_??????_???????????????_?????_????_??????_???.nc"
文件的不同部分应始终具有相同数量的字符,所有文件均以 S 开头并以 .nc 结尾
...但它似乎无法正常工作。有时文件不会重命名,有时会重命名,但不正确。谁能帮忙?我在 stackexchange 上做了很多搜索来尝试解决这个问题,但是 none 的其他解决方案似乎有效——为此我需要什么正则表达式?
以下是要重命名的文件的其他一些示例:
S2A_MSIL2A_20200322T184031_N0214_R070_T12VVJ_20200322T231131_A03.nc
S2A_MSIL2A_20200322T184031_N0214_R070_T12VVK_20200322T231131_A01.nc
S2A_MSIL2A_20200322T184031_N0214_R070_T12VVK_20200322T231131_A02.nc
S2A_MSIL2A_20200322T184031_N0214_R070_T12VVK_20200322T231131_A03.nc
S2A_MSIL2A_20200322T184031_N0214_R070_T12VWK_20200322T231131_A01.nc
应该变成:
S2A_MSIL2A_20200322T184031_N0214_R070_T12VVJ_A03.nc
S2A_MSIL2A_20200322T184031_N0214_R070_T12VVK_A01.nc
S2A_MSIL2A_20200322T184031_N0214_R070_T12VVK_A02.nc
S2A_MSIL2A_20200322T184031_N0214_R070_T12VVK_A03.nc
S2A_MSIL2A_20200322T184031_N0214_R070_T12VWK_A01.nc
使用子字符串语法 %name:~start,length%
:
> set name=S2A_MSIL2A_20200322T184031_N0214_R070_T12VVJ_20200322T231131_A03.nc
> echo %name%
S2A_MSIL2A_20200322T184031_N0214_R070_T12VVJ_20200322T231131_A03.nc
> echo %name:~0,44%%name:~60%
S2A_MSIL2A_20200322T184031_N0214_R070_T12VVJ_A03.nc
最后我采用了 Alex 的建议,但想出了如何将其放入 .bat 脚本中的方法:
@echo off
setlocal ENABLEDELAYEDEXPANSION
cd /D %1
for %%F in (*.nc) do (
set oldName=%%F
set newName=!oldName:~0,44!!oldName:~60!
rename !oldName! !newName!
)
注意:%1 是包含要重命名文件的文件夹的路径(在 D: 驱动器上),作为命令行中 .bat 文件的参数提供。
重要的是在定义变量时不要有 space! (例如 oldName = %%F 无效但 oldName=%%F 有效)
使用 FOR /F
的替代解决方案:
@echo off
FOR %%F in (*.nc) do (
FOR /F "tokens=1-8 delims=_" %%a in ("%%~nF") do ren "%%F" "%%a_%%b_%%c_%%d_%%e_%%f_%%h.nc"
)
屏幕截图:
我正在尝试使用 .bat 脚本重命名文件夹中的一堆文件。
原文件名: S2A_MSIL2A_20200322T184031_N0214_R070_T11UPA_20200322T225116_A03.nc
粗体部分(第二个 date/time)是我要删除的部分
目标文件名: S2A_MSIL2A_20200322T184031_N0214_R070_T11UPA_A03.nc
我试过这个:
rename "S??_??????_???????????????_?????_????_??????_???????????????_???.nc" "S??_??????_???????????????_?????_????_??????_???.nc"
文件的不同部分应始终具有相同数量的字符,所有文件均以 S 开头并以 .nc 结尾
...但它似乎无法正常工作。有时文件不会重命名,有时会重命名,但不正确。谁能帮忙?我在 stackexchange 上做了很多搜索来尝试解决这个问题,但是 none 的其他解决方案似乎有效——为此我需要什么正则表达式?
以下是要重命名的文件的其他一些示例: S2A_MSIL2A_20200322T184031_N0214_R070_T12VVJ_20200322T231131_A03.nc S2A_MSIL2A_20200322T184031_N0214_R070_T12VVK_20200322T231131_A01.nc S2A_MSIL2A_20200322T184031_N0214_R070_T12VVK_20200322T231131_A02.nc S2A_MSIL2A_20200322T184031_N0214_R070_T12VVK_20200322T231131_A03.nc S2A_MSIL2A_20200322T184031_N0214_R070_T12VWK_20200322T231131_A01.nc
应该变成:
S2A_MSIL2A_20200322T184031_N0214_R070_T12VVJ_A03.nc S2A_MSIL2A_20200322T184031_N0214_R070_T12VVK_A01.nc S2A_MSIL2A_20200322T184031_N0214_R070_T12VVK_A02.nc S2A_MSIL2A_20200322T184031_N0214_R070_T12VVK_A03.nc S2A_MSIL2A_20200322T184031_N0214_R070_T12VWK_A01.nc
使用子字符串语法 %name:~start,length%
:
> set name=S2A_MSIL2A_20200322T184031_N0214_R070_T12VVJ_20200322T231131_A03.nc
> echo %name%
S2A_MSIL2A_20200322T184031_N0214_R070_T12VVJ_20200322T231131_A03.nc
> echo %name:~0,44%%name:~60%
S2A_MSIL2A_20200322T184031_N0214_R070_T12VVJ_A03.nc
最后我采用了 Alex 的建议,但想出了如何将其放入 .bat 脚本中的方法:
@echo off
setlocal ENABLEDELAYEDEXPANSION
cd /D %1
for %%F in (*.nc) do (
set oldName=%%F
set newName=!oldName:~0,44!!oldName:~60!
rename !oldName! !newName!
)
注意:%1 是包含要重命名文件的文件夹的路径(在 D: 驱动器上),作为命令行中 .bat 文件的参数提供。
重要的是在定义变量时不要有 space! (例如 oldName = %%F 无效但 oldName=%%F 有效)
使用 FOR /F
的替代解决方案:
@echo off
FOR %%F in (*.nc) do (
FOR /F "tokens=1-8 delims=_" %%a in ("%%~nF") do ren "%%F" "%%a_%%b_%%c_%%d_%%e_%%f_%%h.nc"
)
屏幕截图: