将文件放入文件夹的批处理文件(仅限子文件夹)

时间:2016-02-23 23:17:33

标签: batch-file

我有一个批处理文件,当前将每个文件放在一个文件夹中,并带有文件名。但它只适用于我所在的文件夹。我希望在我的目录顶部有一个批处理文件,它只会执行文件2子文件夹。目录示例:

/Parent folder **This is where I want my batch file**
  /Subfolder 1
    /Subfolder 1A/file.jpg **Level I want batch file to execute**
    /Subfolder 1B/file.mp4 **Level I want batch file to execute**
    /Subfolder 1C/file.mp3 **Level I want batch file to execute**
  /Subfolder 2
    /Subfolder 2A/file.jpg **Level I want batch file to execute**
    /Subfolder 2B/file.mp4 **Level I want batch file to execute**
    /Subfolder 2C/file.mp3 **Level I want batch file to execute**

这是我当前的批处理文件:

@echo off
for %%a in (*.*) do (
    md "%%~na" 2>nul
    move "%%a" "%%~na"
)

1 个答案:

答案 0 :(得分:1)

使用带有/ D选项的FOR循环来迭代文件夹,根据需要重复多个级别。在每一步使用PUSHD,这样您就不必跟踪完整路径。

@echo off
for /d %%a in (*) do (
  pushd "%%a"
  for /d %%b in (*) do (
    pushd "%%b"
    for %%c in (*) do (
      md "%%~nc" 2>nul
      move "%%c" "%%~nc"
    )
    popd
  )
  popd
)

您可以使用%~dp0保证从批处理脚本的父文件夹开始:

@echo off
for /d %%a in ("%~dp0*") do (
  pushd "%%a"
  for /d %%b in (*) do (
    pushd "%%b"
    for %%c in (*) do (
      md "%%~nc" 2>nul
      move "%%c" "%%~nc"
    )
    popd
  )
  popd
)

随着您添加更多关卡,代码变得乏味。您可以使用递归编写更多通用代码,这些代码可以轻松更改为在任何子文件夹深度下工作。只需根据需要更改深度值。请注意如何在嵌套的FOR循环中重复使用字母。

@echo off
setlocal disableDelayedExpansion
set depth=2

:iterateFolders
setlocal
set /a depth-=1
for /d %%F in (*) do (
  pushd "%%F"
  if %depth% gtr 0 (
    call :iterateFolders
  ) else for %%F in (*) do (
    md "%%~nF" 2>nul
    move "%%F" "%%~nF"
  )
  popd
)
exit /b