真的没有必要经历这么多的麻烦。
除了 PUSHD 和 POPD 命令之外,整个东西都可以像 nephi12 一样放在一行上。
为了清晰起见,我将所有内容放在单独的行中,但稍后将在一行中给出两个示例。
REM Set working directory
PUSHD C:\Episode\Footage\
REM Find all the sub directories of the working
REM directory, and if any exist execute the loop below:
For /d %%d in ( *.* ) do (
REM Move all files inside the subdirectory up one level.
move /s %%d\*.* %%d\..\.
REM Delete the directories if they are empty.
RD /y %%d
)
REM Return to your original working directory.
POPD
上述代码将当前目录名压入堆栈,并将 dirs 更改为 Footage。然后该For /d
命令抓取所有(如果有的话)素材的子目录,并先将它们一次提供一个到MOVE
命令中,然后再输入到删除目录命令中。
该MOVE /s
命令将目录 %%d 中的所有文件(包括子文件夹中的任何文件)上移一级。接下来,该RD /y
命令会自动删除现在为空的目录,如果它们不为空,则会导致软错误。
最后一个命令将工作目录返回到它的原始位置,POP
即离开堆栈的路径。
在一行上,没有PUSHD
andPOPD
命令和目录清理,它看起来像这样:
单线解决方案:
For /d %%d in ( *.* ) do move /s %%d\*.* %%d\..\.
带清理功能的单线解决方案:
要包括清理,只需在命令&&
之后move
和之前“添加” and 命令RD
,如下所示:
For /d %%d in ( *.* ) do ( move /s %%d\*.* %%d\..\. & RD /y %%d )
为什么我做了我所做的。
移动一大堆文件的最快方法不是告诉move
如何移动每个文件以及移动每个文件的位置,而是使用通配符,它可以Move
自己弄清楚将它们放在哪里。因此,我没有告诉它一次移动一个文件,而是给它通配符,这样可以MOVE
以最快的速度工作。所以我只为它提供单独的源目录和目标目录,并说“将所有文件从这里复制到那里”。
一组括号(...)
可以容纳解释器认为的单行代码。这会导致一系列全新的问题,但它允许像 %%d 这样的特殊变量存在于(在我们看来是)多行代码中。我在顶部这样做了。FOR
后来,我使用另一组括号来向命令解释器显示语句中单行的一部分,以及不包含的部分。
我还使用了一些旧的 DOS 速记来指定父目录,..
这使我不知道某些东西的确切路径,并且仍然在它的 parent 中操作东西。例如,C:\WINDOWS\..
isC:\
和C:\WINDOWS\SYSTEM32\..
is C:\WINDOWS\
。
您可能会注意到我还使用了文件规范.
。这可能是不必要的,但没有它我已经遇到了足够的麻烦,我使用它。它只是清楚地MOVE
表明我们正在将这些文件移动到一个文件夹,而不是一个文件。而且,哦,是的,MOVE
很乐意将您的数百个文件放在一起移动,除了最后一个之外,它们都毁了。你可以想象我是如何接受的.
。
允许您将&
多个命令或程序串到一行代码中,并允许我将 RD 附加到行尾,并且仍然可以访问FOR
命令创建的特殊变量。
所以,现在如果你注意了,你就会意识到我的第二句话是一个谎言。没有什么能阻止您将 aPUSHD &
和 a添加& POPD
到该行的开头和结尾。