gpt4 book ai didi

batch-file - Windows 批处理文件 : get last folder name from path

转载 作者:行者123 更新时间:2023-12-04 02:03:08 25 4
gpt4 key购买 nike

我正在尝试重命名位于 e:\study\pubpmc\test\extracted 的许多子目录之一中的 .jpg 文件。

我想将文件重命名为 LastFolderName_ImageName.jpg。(例如,如果 Figure1.jpg 位于 e:\study\pubpmc\test\extracted\folder1我希望它像这样重命名:folder1_Figure1.jpg)

所以我需要从文件路径中取出最后一个文件夹名称。由于这是我第一次使用批处理脚本,所以遇到了困难。

我用谷歌搜索并编写了类似的代码但它似乎并没有解决。

你能帮我解决一下,告诉我哪里做错了吗?谢谢! :)

@echo off
cd /D "e:\study\pubpmc\test\extracted"
for /r %%f in (*.jpg) do (
set mydir=%%~dpf
set mydir=%mydir:\=;%

for /f "tokens=* delims=;" %%i in (%mydir%) do call :LAST_FOLDER %%i
goto :EOF

:LAST_FOLDER
if "%1"=="" (
@echo %LAST%
goto :EOF
)

set LAST=%1
SHIFT

goto :LAST_FOLDER


)

最佳答案

JosefZ 解释了您的代码中明显的问题,但他没有指出一个细微的问题,尽管他的代码修复了它:

FOR/R(以及简单的 FOR)在完成磁盘驱动器扫描之前立即开始迭代。循环有可能重复已经命名的文件!这会导致它被重命名两次,给出错误的结果。解决方案是将 FOR/F 与命令“DIR/B”一起使用,因为 FOR/F 总是在 迭代之前处理命令直至完成。

JosefZ 还提供适用于大多数情况的代码。但是有一个更简单的解决方案始终有效:

@echo off
for /f "delims=" %%A in (
'dir /b /s /a-d "e:\study\pubpmc\test\extracted\*.jpg"'
) do for %%B in ("%%A\..") do ren "%%A" "%%~nxB_%%~nxA"

"%%A\.." 将文件名视为一个文件夹,并向上走到父文件夹。所以 %%~nxB 给出了父文件夹的名称。

该命令可以作为一个长的衬里运行,直接从命令行(无批处理):

for /f "delims=" %A in ('dir /b /s /a-d "e:\study\pubpmc\test\extracted\*.jpg"') do @for %B in ("%A\..") do @ren "%A" "%~nxB_%~nxA"

关于batch-file - Windows 批处理文件 : get last folder name from path,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29327598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com