Windows bat文件等同于bash字符串操作

Bar*_*uch 2 windows bash batch-file

我怎样才能做到这一点:

for i in *.e; do mv $i ${i%-b*.e}.e; done
Run Code Online (Sandbox Code Playgroud)

在Windows批处理文件中?(它将包含"-b"的文件重命名为"-b"之前的部分.请注意,这不一定是字符串的结尾!例如"file-b-4.e"将变为"file.e")

dbe*_*ham 5

如果您真的想批量执行此操作,这应该可行

@echo off
setlocal disableDelayedExpansion
for %%F in (*.e) do (
  set "var=%%~F"
  setlocal enableDelayedExpansion
  set "var=!var:-b=.e:!"
  for /f "eol=: delims=:" %%A in ("!var!") do (
    endlocal
    echo ren "%%F" "%%A"
  )
)
Run Code Online (Sandbox Code Playgroud)

编辑
panda-34的评论暗示如果文件名以...开头,原始发布的代码失败-b.通过将扩展名合并到替换字符串中来修复上面的代码.(感谢panda-34警告我这个问题)

panda-34还提供了一种替代解决方案,它使用命令注入和搜索和替换.注入的命令是REM语句.

只要文件名不包含&^字符,panda-34解决方案就可以工作,但如果文件名不包含,则会失败.

下面是命令注入技术的修改版本,它应该适用于所有有效的Windows文件名.有两个关键的mod,1)确保文件名中的特殊字符始终被引用,2)不要将值作为CALL参数传递,否则^将加倍^^.

@echo off
setlocal disableDelayedExpansion
for %%i in (*-b*.e) do (
  set old="%%~ni"
  call :ren_b
)
exit /b
:ren_b
set v=%old:-b=.e"&rem "%
echo ren "%old:~1,-1%.e" %v%
exit /b
Run Code Online (Sandbox Code Playgroud)

最终编辑(我希望):
正如baruch在他的评论中指出的那样,上面的解决方案从第一次出现开始删除,而原始的bash命令从最后一次出现开始删除.

下面的版本应该与原始bash命令完全等效.

@echo off
setlocal disableDelayedExpansion
set "search=-b"
for %%A in (*%search%*.e) do (
  set "old=%%A"
  setlocal enableDelayedExpansion
  set "new=\_!old:%search%=\_!"
  for %%B in ("!new!") do (
    endlocal
    set "new=%%~pB"
    setlocal enableDelayedExpansion
    set "new=!new:~2,-1!.e"
    echo ren "!old!" "!new:\_=%search%!"
    endlocal
  )
)
Run Code Online (Sandbox Code Playgroud)