如何在Windows中递归地将目录中的文件复制到另一个目录?

时间:2014-05-29 14:06:44

标签: powershell cmd xcopy

我必须创建一个脚本来将文件从文件夹结构复制到其他文件。

我的源文件夹结构与此类似:

-RootFolder
    --ParentFolder1
      --SubParentFolder1
           --ToCopy
                    /*Here are the files to copy*/
      --SubParentFolder2
    --ParentFolder2
      --OtherSubParentFolder
           --ToCopy
                    /*Here are the files to copy*/
    --ParentFolder3
      --OtherSubParentFolder2

我想要复制" ToCopy "中的文件。文件夹,到另一个文件夹,具有以下结构:

目标文件夹结构:

--TargetDirectory
     --SubParentFolder1
          //Here the files that were in the ToCopy folder inside the SubParentsFolder1
     --OtherSubParentFolder
          //Here the files that were in the ToCopy folder inside the OtherSubParentFolder

请注意,我使用" ToCopy"的名称。目标子文件夹中的父文件夹。

我知道如何用代码(比如C#)来做这件事,但我对如何用批处理文件实现它感到很遗憾。它甚至可能吗?或者我需要使用像PowerShell这样的东西?

如何按照我描述的结构复制文件?

2 个答案:

答案 0 :(得分:2)

我认为,这应该有用......

$Folder= gci -path "d:\pstest" -recurse -Filter "ToCopy" | where { $_.psiscontainer } 
Foreach ($Foldername in $Folder) {
$Destinationfolder=$Foldername.Parent
copy-item  $Foldername.fullname -Destination "d:\Outputfolder\$Destinationfolder" -recurse
}

答案 1 :(得分:0)

您好跟随的是我攻击的脚本(通过堆栈溢出的帮助),从txt文档读取文件,然后请求目标文件夹输入和src文件夹名称然后只是去递归复制所有文件到新文件夹,不保留旧的子文件夹结构。

我将来会更新这个链接到我从管理区域获得基本模板的人,但要记住,一旦你点击批处理可以运行,好像它是一个PHP脚本然后一切都有意义。花了我一整天的时间来研究SS64.com

上的每个命令和替代方案

需要注意的主要是pushd "%~dp0"这用来确保批处理总是以root身份使用我当前的目录。

如上所述,由于我在woocommerce商店更新期间积极使用它来移动文件,因此我会对此进行正确的写作并进一步说明。的 P.S。应输入文本文件名而不使用.txt扩展名,并且每个文件名应从新行开始。此外,如果目标目录不存在,它将创建它。使用excel可能列出名称然后重命名可以输出到新列并编译批量重命名命令副本到新批处理运行第一批获取文件和第二批重命名为首选标题,我这样做是为了保持我的理智。

对不起只是我如何使用它的一个例子,但是请继续享受希望这对你有用。

@echo off
CLS
setlocal EnableDelayedExpansion
REM Changes root path to relative of current bat folder
pushd "%~dp0"


REM finds files in provided .txt file and copies them to destination directory
REM CHECK FOR ADMIN RIGHTS
COPY /b/y NUL %WINDIR%\06CF2EB6-94E6-4a60-91D8-AB945AE8CF38 >NUL 2>&1
IF ERRORLEVEL 1 GOTO:NONADMIN
DEL %WINDIR%\06CF2EB6-94E6-4a60-91D8-AB945AE8CF38 >NUL 2>&1

:ADMIN
REM GOT ADMIN RIGHTS
COLOR 1F
ECHO Hi, %USERNAME%!
ECHO Please wait...

set /p DEST_DIR="Copy files to:"%=%
set /p SEARCH_DIR="Copy files from:"%=%
@echo.
@echo Please check folder name for accuracy.
@echo Copy files to: %DEST_DIR%
@echo Copy files from: %SEARCH_DIR%
set /p CORRECT_FOLDERS="Are these correct? (please check spelling) y/n:"
if '%CORRECT_FOLDERS%'=='y' GOTO:YES_ANSWER
if '%CORRECT_FOLDERS%'=='n' GOTO:NO_ANSWER
COLOR 2F
ECHO.
PAUSE
GOTO:EOF

:NONADMIN
REM NO ADMIN RIGHTS
COLOR 4F
ECHO.
ECHO PLEASE RUN AS ADMINISTRATOR
ECHO.
pause
GOTO:EOF

:YES_ANSWER
@echo.
@echo you answered yes
@echo.
if exist %DEST_DIR% GOTO:READ_DATA
if not exist %DEST_DIR% md %DEST_DIR%&GOTO:READ_DATA
PAUSE

:NO_ANSWER
@echo.
@echo you answered no 
set /p TRY_AGAIN="Try again? y/n:"
if '%TRY_AGAIN%'=='y' GOTO:YES_ANSWER
if '%TRY_AGAIN%'=='n' GOTO:EXIT_PROGRAM
PAUSE

:EXIT_PROGRAM
@echo.
@echo "So Sorry"
PAUSE
GOTO:EOF

:READ_DATA
@echo.
set /p GET_FILENAMES="What is the name of the text file your filenames are stored in?"%=%
if exist %GET_FILENAMES%.txt @echo We will now read and copy the files for you, have some coffee might take awhile & GOTO:WRITE_DATA
if not exist %GET_FILENAMES%.txt @echo Filename does not match, please type only the name without .txt extention & GOTO:READ_DATA
PAUSE

:WRITE_DATA
@echo.
@echo reading file name...
for /f "usebackq delims=" %%a in ("%GET_FILENAMES%.txt") do (
    for /r "%SEARCH_DIR%" %%b in ("%%a*") do (
        @echo Copy Started...
        copy "%%b" "%DEST_DIR%\%%~nxb"
    )
)
@echo Copy finished, please review actions. Lekker Man.
PAUSE``