2014-04-21 131 views
0

我想使用该模式一次执行所有8k +文件,因为文件的左边5个字符与要移动到的子目录的右边5匹配。Powershell基于文件名将文件从目录移动到子目录

此工程一个接一个:

move-item -path X:\"Property Files"\05165*.pdf -destination X:\"Property Files"\"* -- 05165"; 
move-item -path X:\"Property Files"\05164*.pdf -destination X:\"Property Files"\"* -- 05164"; 

预先感谢您的任何帮助。

回答

0

作为一个内胆,假设目标文件夹已经存在:

Get-ChildItem "X:\Property Files\*.PDF" | 
ForEach { move -path $_ -destination ($_.directoryname +"\* -- "+ $_.Name.substring(0,5))} 

仅使用文件名,你只要提取前五个字符(substring(0,5)),然后用它作为要匹配的文件夹的结尾。
$_.Directoryname假设目标文件夹是源路径的子文件夹。

+0

非常感谢。它工作完美。我在使用*之前的5位数字前尝试了几个文件,然后让它放到整个目录中,当它测试出来作为工作时,我只把星号放回去,然后回车。我的机器花了大约一个小时,但比以前快了很多。欣赏节省时间。 :-) – user3516394

0

好的,你在正确的道路上整个RegEx标签在这里。我所做的是查找所有内容,直到最后一个反斜杠,然后捕获5个数字,然后是所有不是反斜线的行,直到行尾,并且只返回捕获的组。我将其设置为变量$ItemNumber,并将其用于目的地。我在ForEach循环中运行目标源文件夹中的所有内容。这里是我结束了代码:

ForEach($File in (GCI "X:\Property Files\*.PDF")){ 
$ItemNumber = $File.Fullname -replace ".+?\\(\d{5})[^\\]*$", "`$1" 
move-item -path X:\"Property Files"\05165*.pdf -destination X:\"Property Files"\"* -- $ItemNumber" 
} 

你可以做到这一点通过管如果你想,像这样:

GCI "X:\Property Files\*.PDF"|%{move-item -path X:\"Property Files"\05165*.pdf -destination X:\"Property Files"\"* -- $($_.Fullname -replace ".+?\\(\d{5})[^\\]*$", "`$1")"} 

但是得到那种长,有的人真的不就像那么长的一条线。

RegEx可以测试here,再加上它打破了一切。 (链接到regex101.com解释)

+0

也欣赏你的帮助。我正在寻找一个批处理过程,并不需要对每个文件进行命名,所以这并不完全符合法案。很高兴知道正则表达式网站。 – user3516394

+0

这不应该重命名文件,只需移动它们,但我很高兴您找到了适合您的解决方案。 – TheMadTechnician

相关问题