因此,我是脚本和批处理文件的新手。
我正在根据要复制的文件列表来复制文件。我有一个要复制的文件列表的文本文件,我希望脚本从源目录逐行复制所有这些文件。
例如,我要复制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?
答案 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
}
}