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")
如果您真的想批量执行此操作,这应该可行
@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)
| 归档时间: |
|
| 查看次数: |
729 次 |
| 最近记录: |