如何将基于列表的文件复制到也基于列表创建的相应文件夹中?

时间:2018-10-24 22:21:26

标签: c powershell batch-file cmd scripting

因此,我是脚本和批处理文件的新手。

我正在根据要复制的文件列表来复制文件。我有一个要复制的文件列表的文本文件,我希望脚本从源目录逐行复制所有这些文件。

例如,我要复制1000多个文件,每个要创建并将其放入的文件夹都有3个文件。下面是文件名格式的示例:

file3_AB12_autoc.pdf
file3_AB12.jpeg
file1_AB12.png

file3_CD34_autoc.pdf
file3_CD34.jpeg
file1_CD34.png

...etc...

一旦这些文件被复制,我想将它们移动到使用文本文件和以下命令创建的文件夹中:

FOR /F %i in (folders_list.txt) do md %i

现在,使用我的脚本,我想将其复制的文件移动到相应的文件夹中。基本上,如果文件名包含文件夹名称,则应将其移入文件夹。例如:

C:\AB12                          THIS FOLDER SHOULD HAVE ALL THE FOLLOWING FILES
     file3_AB12.jpeg
     file3_AB12_autoc.pdf
     file1_AB12.png

C:\CD34                          THIS FOLDER SHOULD HAVE ALL THE FOLLOWING FILES
     file3_CD34.jpeg
     file3_CD34_autoc.pdf
     file1_CD34.png

我已经查询了其他类似的问题,但是对于我想做的事情似乎没有任何作用。我相信下面的链接很有用,但我不知道如何将它们组合在一起。

How do I copy files into folders based on the file containing the folder name?

Copy files based on a list stored in .txt file

1 个答案:

答案 0 :(得分:0)

在PowerShell中,Move-Item将移动文件。然后,您只需要正则表达式来确定路径和新文件名,类似于:

$txt = "file3_AB12_autoc.pdf
file3_AB12.jpeg
file1_AB12.png
file3_CD34_autoc.pdf
file3_CD34.jpeg
file1_CD34.png
badfilename.txt"

foreach ($orig_file in $txt -split '\r\n') {

    if ( $orig_file -match '^([^_]*)_([^_.]*)(.*)\.(.*)$' ) {
        $dir = $matches[2]
        $new_file = '{0}{1}.{2}' -f $matches[1], $matches[3], $matches[4]

        'Moving {0} to {1}\{2}' -f $orig_file, $dir, $new_file

        Move-Item -Path $orig_file -Destination ('{0}\{1}' -f $dir, $new_file)

    }
    else {
        '{0} not processed' -f $orig_file        
    }

}