Cmd 如何使用Windows命令行删除下划线后字符串的最后一部分

Cmd 如何使用Windows命令行删除下划线后字符串的最后一部分,cmd,Cmd,我有一个文件名为“RAAAAAAV.KKK9.Z01_yyymmddhhmmss”。我想使用一行dos命令删除下划线“389;”后的最后一部分。请帮忙 所需输出: RAAAAAAV.KKK9.Z01以下工程 @echo off set var=RAAAAAAV.KKK9.Z01_YYYYMMDDhhmmss set "var=%var:_="&rem % set var 要重命名特定文件,请执行以下操作: ren "RAAAAAAV.KKK9.Z01_20151009231015" *

我有一个文件名为“RAAAAAAV.KKK9.Z01_yyymmddhhmmss”。我想使用一行dos命令删除下划线“389;”后的最后一部分。请帮忙

所需输出: RAAAAAAV.KKK9.Z01

以下工程

@echo off
set var=RAAAAAAV.KKK9.Z01_YYYYMMDDhhmmss
set "var=%var:_="&rem %
set var

要重命名特定文件,请执行以下操作:

ren "RAAAAAAV.KKK9.Z01_20151009231015" *.Z01
要重命名扩展名为Z01_timestamp的所有文件,请执行以下操作:

ren *.Z01_?????????????? *.Z01
要重命名扩展名开头未知的所有文件,请执行以下操作:

for %F in (*.???_??????????????) do @for /f "delims=_" %X in ("%~xF") do @ren "%F" "%~nF%X"
如果在批处理脚本中使用,则百分比必须加倍:

@echo off
for %%F in (*.???_??????????????) do for /f "delims=_" %%X in ("%%~xF") do ren "%%F" "%%~nF%%X"

编辑-2015-10-10

如果您真的想精确控制重命名哪些文件,那么可以使用my-一种混合JScript/批处理脚本,从XP开始在任何Windows机器上本机运行。以下简单的一行代码从任何文件中去掉下划线和时间戳,该文件的扩展名由字母和数字的任意组合组成,后跟下划线,后跟14位时间戳

jren "(\.[A-Z0-9]+)_\d{14}$" $1 /i

也许已经晚了,但无论如何我都会分享我的创始,以造福他人

您可以使用批处理子过程/功能

:leftStr STRING SEPARATOR RESULT_VAR
::get left string before some specific SEPARATOR
set "STRING=%~1"                get arg1
set "RIGHT=%STRING:*%~2=%"      anything after arg2
set "%~3=!STRING:%~2%RIGHT%=!"  strip that substr
exit /b
然后,您可以从其他地方调用它,甚至可以在启用了delayedExpansion的for循环内部工作

..
call :leftStr "left_right" "_" varname
echo !varname!
@rem varname = left
注意:这不是一个花哨的函数,没有错误检查之类的。您最好确保您的输入字符串、分隔符、return\u var已经有效,或者与其他字符串没有冲突


编辑:忘了提到,这是用于任意长度的字符串和分隔符,对于简单的固定长度,您可以只使用%var:~-N1,N2%(负N1)

您已经尝试过了吗?您使用的是什么操作系统?对于MS-DOS来说,这是一个不太可能的文件名。@RossRidge-鉴于我的答案对OP有效,它肯定是Windows,而不是DOS。我已经相应地编辑了这个问题。您好,以下两个限定符本质上是动态的“KKK9.Z01”,所以我不能使用*。Z01@user3032562-如果你在你的问题上投入更多的精力,那么你本可以更具体一些。然而,我预料到了这个问题,这就是为什么我在回答中提供了最后两个选项。如果您花时间阅读我的所有答案,您会意识到它处理的是您忽略指定的动态特性。请给我一个一行代码,它将删除最后一个下划线(\ux)之后的所有内容