Powershell根据文件名将文件从目录移动到子目录

时间:2014-04-21 20:58:24

标签: regex windows powershell pattern-matching batch-processing

我想使用模式一次完成所有8k +文件,因为文件的左边5个字符与要移动到的子目录的右边5匹配。

这是一个接一个的工作:

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";

提前感谢您的帮助。

2 个答案:

答案 0 :(得分: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解释)

答案 1 :(得分:0)

作为单行,假设目标文件夹已存在:

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

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