通过读取文本文件从目录结构中搜索并复制文件

通过读取文本文件从目录结构中搜索并复制文件

我有一个文件夹,里面有许多子文件夹和文件。我有一个文本文件,里面有我想复制到单独目标文件夹的文件的名称。文本文件中的文件名没有路径信息。

在目标文件夹中,我希望重新创建文件及其文件夹结构。有没有可以快速执行此操作的脚本?或者工具?我在 Windows 上。

答案1

以下 PowerShell 脚本应该可以执行您想要的操作。

更改前三个变量以适合您的环境。

## Q:\Test\2018\06\28\SU_1334840.ps1
#Requires -Version 3

# get files to copy from file in same foler
$FileList = Get-Content '.\FileList.txt'
$BaseSrc = 'X:\Source\path\'
$BaseDst = 'Y:\Destination\path\'

ForEach ($File in $FileList){
   ForEach ($Find in (Get-ChildItem $BaseSrc$File -File -Recurse)) {
       $DestFile = Join-Path $BaseDst ($Find.FullName.Replace($BaseSrc,'') )
       $DestDir = Split-Path $DestFile
       If (!(Test-Path $DestDir)){ MD $DestDir |Out-Null}
       # "Copying {0} to {1}" -f $Find.FullName,$DestFile
       Copy-Item $Find.FullName $DestFile
    }
}

要查看脚本运行时发生的情况,请删除#之前的"Copying...

该脚本至少需要 PowerShell 版本 3

根据列表的大小/源树中的文件和子目录的数量,这种略有不同的方法可能会更快。

## Q:\Test\2018\06\28\SU_1334840_2.ps1
#Requires -Version 3

# get files to copy from file in same foler
$FileList = Get-Content '.\FileList.txt'
$BaseSrc = 'X:\Source\path\'
$BaseDst = 'Y:\Destination\path\'

ForEach ($File in (Get-ChildItem $BaseSrc -File -Recurse)) {
    If ($File.Name -in $FileList) {
       $DestFile = Join-Path $BaseDst ($File.FullName.Replace($BaseSrc,'') )
       $DestDir = Split-Path $DestFile
       If (!(Test-Path $DestDir)){ MD $DestDir |Out-Null}
       "Copying {0} to {1}" -f $File.FullName,$DestFile
       Copy-Item $File.FullName $DestFile
    }
}

示例输出:

> . Q:\Test\2018\06\28\SU_1334840.ps1
Copying C:\sys\7z.dll to A:\Test\sys\7z.dll
Copying C:\sys\7z.exe to A:\Test\sys\7z.exe
Copying C:\sys\ClipBoard.exe to A:\Test\sys\ClipBoard.exe
Copying C:\sys\ClipBoard.txt to A:\Test\sys\ClipBoard.txt
Copying C:\sys\DUMPHEX.EXE to A:\Test\sys\DUMPHEX.EXE

相关内容