基于批处理的文件/文件夹创建的问题

时间:2011-04-10 08:28:02

标签: windows-7 batch-file

首先,我要感谢任何能提前提供帮助的人,多年来我没有做过像这样的任何批处理脚本而且“生锈”是轻描淡写的。我在映射驱动器上有很多文件,我想要做一些工作,而不会有损坏这些文件的风险,所以我试图创建一个本地版本的'假'文件,所以如果事情搞砸了没有坏处。

这一切都是在Windows 7机器上完成的,所以我开始运行以下内容来获取整个目录列表来操作:

dir /b M:\ > movies.txt

从那里,如果我运行以下内容,我可以根据'movies.txt'中的行获得单独的0字节假文件:

for /F "eol=; tokens=1* delims=," %%i in (movies.txt) do @echo.> %%i.avi

或者,如果我运行以下命令,我将根据'movies.txt'得到空目录:

for /F "delims=~" %%f in (movies.txt) DO MD "%%f"

这些命令中的任何一个的问题是我要么将一堆文件全部集中到根文件夹中(第一个'用于'命令)或者我得到空目录(第二个用于'命令)但我似乎无法看到找出如何将假文件放入文件夹。

示例:如果Mapped Drive“M”包含以下电影文件:

M:\Las Vegas Trip (2009)\Las Vegas Trip (2009).avi
M:\Las Vegas Trip (2010)\Las Vegas Trip (2010).avi

然后'movies.txt'将显示为:

Las Vegas Trip (2009)
Las Vegas Trip (2010)

并且第一个命令将导致:

D:\Las Vegas Trip (2009).avi
D:\Las Vegas Trip (2010).avi

或第二个命令将导致:

D:\Las Vegas Trip (2009)\
D:\Las Vegas Trip (2010)\

但我需要的是:

D:\Las Vegas Trip (2009)\Las Vegas Trip (2009).avi
D:\Las Vegas Trip (2010)\Las Vegas Trip (2010).avi

我已经在互联网上搜索了几天,似乎找不到能给我预期效果的任何东西......我确实在其他地方找到了一个类似的“问题”,他们想根据文件创建文件夹名称,但他们想要自动重命名不起作用的最终结果文件名。 (是的,我试图修改他们的命令以便工作,但是我没有做出任何改变会产生任何错误。) 您可以看到上面提到的方法here(现场)。

修改我尝试从包含的链接中获取代码:

for /f %%f in ('dir *.png /b') do md %%~nf & move %f .\%%~nf\0000.png <- original
for /f %%f in ('dir *.avi /b') do md %%~nf & move %f .\%%~nf\*.avi
for /f %%f in ('dir *.avi /b') do md %%~nf & move %f .\%%~nf\
for /f %%f in ('dir *.avi /b') do md %%~nf & move %f .\%%~nf

在每种情况下,我都在参考代码“%% ~nf * .avi”部分的最后部分时遇到错误。

任何关于如何修改代码以适合我或其他可行的代码的想法都将非常感激。

-------编辑部分------- 我尝试更改我的批处理文件以使用下面帖子中提供的命令,它似乎不起作用:

cd Movies2
dir /b %MovieSource% > movies.txt
for /f "delims=" %%f in ('dir *.avi /b') do md "%%~nf" & move "%~f" ".\%%~nf\*.avi"
rem for /F "eol=; tokens=1* delims=," %%i in (movies.txt) do @echo.> %%i.avi
rem FOR /F "delims=~" %%f in (movies.txt) DO MD "%%f"

我还尝试将第一个'for'命令放在第二个并且unREM将另一个'for'命令,以便它预先创建* .avi,认为可能有效,但尝试它的方式会产生相同的错误。

The following usage of the path operator in batch-parameter
substitution is invalid: %~f" ".\%%~nf\*.avi"

2 个答案:

答案 0 :(得分:1)

这似乎是FOR /F语句中的问题,因为它使用标准分隔<space><TAB>

它应该与

类似
for /f "delims=" %%f in ('dir *.avi /b') do md "%%~nf" & move "%~f" ".\%%~nf\*.avi"

答案 1 :(得分:1)

试试这个:

@ECHO OFF

SET oldroot=M:\
SET newroot=D:\newroot\
FOR /R "%oldroot%" %%f IN (*) DO CALL :processfile "%%f"
GOTO :EOF

:processfile
SET "oldfile=%~1"
CALL SET "newfile=%%oldfile:%oldroot%=%newroot%%%"
CALL :checkpath "%newfile%"
ECHO.>"%newfile%"
GOTO :EOF

:checkpath
SETLOCAL EnableExtensions
IF NOT EXIST "%~dp1" MKDIR "%~dp1"
ENDLOCAL
GOTO :EOF
  • 此脚本按oldroot中指定的路径迭代所有文件。

  • 每个完全限定文件名中的旧根路径将替换为新根(newroot变量)的路径,从而生成另一个完全限定的文件名(存储在{{1}中)变量)。

  • 检查新文件的路径:如果它不存在,则创建它。

  • 最后,生成一个带有新名称的空文件。

修改

newfile行实际上会生成一个带有EOL字符(ECHO.>"%newfile%")的文件,因此这样一个文件的大小为2,而不是0.如果你希望它为0,那么你可以用这个结构替换0x0D0A位:

ECHO