我具有这样的文件结构:
folder +---a | \---b | \---foo bar +---c | \---d | \---foo bar +---. \---.
我想使用foo bar
将batch-file移到它自己的父文件夹中。
我在command-line中尝试过,但它说:
The syntax of the command is incorrect.
cd "path to folder"
for /r %x in (foo bar) do move "%x" ".."
编辑
我将命令更改为此:
for /r %x in ("foo bar") do move "%x" "%~px.."
但是现在出现错误,因为这里有引号:("foo bar")
,我该怎么办?用foo?bar
代替"foo bar"
吗?
for /r /d %A in (*) do if /i "%~nxA" == "foo bar" move /y "%~A" "%~dpA.."
将*
用作(set)
。如果查看for /?
,则可能会看到:
(set)指定一组一个或多个文件。可以使用通配符。
因此,(set)
是文件,而不是文件夹。
理想情况下,为for
变量使用一个字母,而不是修饰字母。 x
表示扩展修饰符。
[%~nxA
将是当前文件夹名称,并检查是否为foo bar
。
如果move
已经存在,如果foo bar
失败,则拒绝访问以警告它的存在。
如果用于批处理文件,请将%
字符加倍至%%
。
备用循环:
for /f "delims=" %A in ('dir /b /s /a:d "*foo bar"') do if /i "%~nxA" == "foo bar" move /y "%~A" "%~dpA.."
它将在循环开始之前获取路径,以避免同一文件夹的多次移动。
如果您仅移动具有特定名称的目录,例如foo bar
,则以下command-line可能会有所帮助:
PushD "folder"&&(For /D %G In (*)Do @For /D %H In ("%G\*") Do @RoboCopy "%H\foo bar" "%G\foo bar" /E /Move)&PopD)>NUL 2>&1
如果要将所有目录(无论其名称如何)从folder
以下的三个级别上移一个级别,那么也许就足够了。
PushD "folder"&&(For /D %G In (*)Do @For /D %H In ("%G\*") Do @For /D %I In ("%H\*")Do @RoboCopy "%I" "%G\%~nxI" /E /Move)&PopD)>NUL 2>&1
请注意,没有包含任何检查来确定包含您的目标的第二级目录现在是否为空。如果是,并且希望删除它们,则需要扩展命令行,或根据需要添加新的命令行。