batch - 在循环到某个文件类型时从路径中删除子字符串

时间:2014-09-02 03:35:12

标签: batch-file

我在搜索某些文件类型时尝试从已知路径中只获取一个目录名称。在下面的示例中,我正在搜索mp4视频文件,然后我想转换它们并将它们移动到不同父目录中的同名子目录中。在文件的直接父目录之前,路径已知,因此我试图删除路径的已知部分。这给我带来了很多麻烦。在下面的示例中,变量newDir在set命令后为空,并且仅显示带有@echo的~13输入。谁能告诉我我做错了什么?

示例:

setlocal enabledelayedexpansion

FOR /R %%X in ("*.mp4") DO (
    set currDir="%%~pX"        &REM "\test1\test2\dir1"
    set newDir=%currDir:~13%   &REM dir1
    mkdir "C:\new\%newDir%"    &REM suppose to be "C:\new\dir1", mine is just "C:\new\"
    REM convert mp4 here
    cp %%X "C:\new\%newDir%"   &REM copies the file
)

2 个答案:

答案 0 :(得分:0)

enabledelayedexpansion循环中使用for时,您应该使用!newDir!代替%newDir%,并使用!currDir:~13!代替%currDir:~13%来延迟扩张发生。

[更新]还有小错误。当你set变量时,你应该注意空格和引号。它们是要设置的字符串的实际部分。并且您有多次mkdir相同的目录,而且对用户copyxcopy而不是' cp'更好。应该来自" Cygwin"或" MinGW32"或者其他的东西。如果不存在,xcopy会自动为您创建文件夹。

要使您的代码正常工作,请参阅下文。并且建议您在开始编程之前更好地了解有关bat的更多基础知识。

@echo off & setlocal enabledelayedexpansion

FOR /R %%X in ("*.mp4") DO (
    set currDir=%%~pX
    set newDir=!currDir:~13!
    REM mkdir "C:\new\!newDir!"
    REM convert mp4 here
    xcopy "%%X" "C:\new\!newDir!"
)

答案 1 :(得分:0)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
FOR /R "%sourcedir%" %%a IN (*.mp4) DO (
 FOR %%m IN ("%%~dpa.") DO ECHO(XCOPY "%%a" "c:\new\%%~nm\"
)

GOTO :EOF

您需要更改sourcedir的设置以适合您的具体情况。

所需的XCOPY命令仅用于ECHO用于测试目的。 在您确认命令正确后,将ECHO(XCOPY更改为XCOPY以实际复制文件。

我注意到您使用非常cygwin nish cp代替copy。注意名字缩写。我将命令更改为xcopy,以便在需要时自动生成目标目录。请注意,如果目标文件已存在,您还没有说出要执行的操作。

这是在我的测试目录上试运行:

XCOPY "U:\sourcedir\misc\90s\ACDC - Back in Black.mp4" "c:\new\90s\"
XCOPY "U:\sourcedir\misc\90s\extended\Kelly Rowland - Wor! (Freemasons Arabic Mix).mp4" "c:\new\extended\"
XCOPY "U:\sourcedir\misc\90s\extended\Kelly Rowland - Work (Freemasons Arabic Mix).mp4" "c:\new\extended\"
XCOPY "U:\sourcedir\one\dummyfile1.mp4" "c:\new\one\"
XCOPY "U:\sourcedir\t w o\dum myfile2.mp4" "c:\new\t w o\"
XCOPY "U:\sourcedir\t w o\dum ile2.mp4" "c:\new\t w o\"