Batch file 批处理-在循环特定文件类型时从路径中删除子字符串

Batch file 批处理-在循环特定文件类型时从路径中删除子字符串,batch-file,Batch File,在搜索某些文件类型时,我试图从已知路径中只获取一个目录名。在下面的示例中,我正在搜索mp4视频文件,然后我想将它们转换并移动到不同父目录中同名的子目录中。该路径在文件的直接父目录之前是已知的,因此我试图删除该路径的已知部分。这给我带来了很多麻烦。在下面的示例中,变量newDir在set命令之后为空,并且它仅显示@echo打开时的~13输入。谁能告诉我我做错了什么 例如: setlocal enabledelayedexpansion FOR /R %%X in ("*.mp4") DO (

在搜索某些文件类型时,我试图从已知路径中只获取一个目录名。在下面的示例中,我正在搜索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
)

使用
for
循环中的
启用延迟扩展
,您应该使用
!纽迪尔而不是
%newDir%
,还有
!柯尔迪尔:~13而不是
%currDir:~13%
以使延迟扩展发生

[更新]还有一些小错误。当
设置变量时,应注意空格和引号。它们是要设置的字符串的实际部分。而且您多次使用同一目录
mkdir
,而且最好使用
copy
xcopy
而不是来自“Cygwin”或“MinGW32”之类的“cp”
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!"
)
@ECHO关闭
SETLOCAL
设置“sourcedir=U:\sourcedir”
对于(*.mp4)中的/R“%sourcedir%”%%a,请执行以下操作(
对于%%m IN(“%%~dpa.”)执行ECHO(XCOPY“%%a”c:\new\%%~nm”
)
后藤:EOF
您需要更改
sourcedir
的设置以适应您的环境

所需的XCOPY命令仅用于测试目的。
ECHO
ed。验证命令正确后,将
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\"

引号(我需要引号,因为有些目录名有空格)和感叹号看起来有点奇怪。就像它试图让目录
“C:\new\dir1”
但是在最初的测试中它似乎是有效的。我需要额外的测试来确保它不会干扰其他东西。再看一眼它就不起作用了。使用
“C:\new\!newDir!”
的转换输出尝试创建一个输出文件
“C:\new\dir1\\output.out”
“C:\new\dir1\output.out”
(取决于我是否添加了斜杠),在这两种情况下都给出了“找不到指定的路径”。在
“C:\new\dir1\”
中的空格实际来自每行后面的
“&REM…”
。请删除它们,或将它们放在其他行中。更新答案并修复脚本中的错误。