我在搜索某些文件类型时尝试从已知路径中只获取一个目录名称。在下面的示例中,我正在搜索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
)
答案 0 :(得分:0)
在enabledelayedexpansion
循环中使用for
时,您应该使用!newDir!
代替%newDir%
,并使用!currDir:~13!
代替%currDir:~13%
来延迟扩张发生。
[更新]还有小错误。当你set
变量时,你应该注意空格和引号。它们是要设置的字符串的实际部分。并且您有多次mkdir
相同的目录,而且对用户copy
或xcopy
而不是' 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\"