我在一个目录中有几千个文件。其中许多文件需要根据文件名的一部分组合在自己的目录中。我需要文件名的一部分作为目标文件夹名称。我把破折号放在文件名的一部分,我需要命名目录。
例如,以下文件位于单个目录中:
我需要将所有带有“-123-”的文件移动到名为“123”的文件夹中。同样,我需要将所有带有“-456-”的文件移动到名为“456”的文件夹,依此类推。
这是我到目前为止所做的:
$dir = "C:\convert"
$filelist = (Get-Item $dir).GetFiles()
foreach ($file in $filelist)
{
$newdir = $file.Name -match '-\d+-'
Move-Item $file -Destination "C:\convert\$matches[0]"
}
我也试过这个:
$dir = "C:\convert"
$filelist = (Get-Item $dir).GetFiles()
foreach ($file in $filelist)
{
$pieces = $file-split"-"
$start = $pieces.Count*-1
$folder = $pieces[$Start..-2]-join" "
$destination = "C:\convert\{0}" -f $folder
if (Test-Path $destination -PathType Container)
{
Move-Item -Path $filename -Destination $destination
}
}
答案 0 :(得分:1)
试试这个
$dir = "C:\convert"
$filelist = @(Get-ChildItem $dir)
ForEach ($file in $filelist){
# Gets the '123' part
$folder = $file.Name.Split("-")[1]
#Test if folder exists.
Set-Location ($dir+'\'+$folder)
#If no folder, create folder.
if(!$?){ mkdir ($dir+'\'+$folder) }
#Move item keeping same name.
Move-Item $file.FullName ($dir+'\'+$folder+'\'+$file.Name)
}
}
答案 1 :(得分:0)
使用正则表达式中的捕获组从文件名中提取数字:
Get-ChildItem $dir -File | Where-Object {
$_.Name -match '-(\d+)-.pdf$'
} | ForEach-Object {
Move-Item $_.FullName ('{0}\{1}' -f $dir, $matches[1])
}
或者像这样,因为Move-Item
可以直接从管道中读取:
Get-ChildItem $dir -File | Where-Object {
$_.Name -match '-(\d+)-.pdf$'
} | Move-Item -Destination {'{0}\{1}' -f $dir, $matches[1]}
答案 2 :(得分:0)
我喜欢Ansgars方法,如果仍然需要创建子文件夹:
Get-ChildItem -Path $dir -Filter "*-*-.PDF" |
Where-Object Name -match '-(\d+)-.pdf$' |
ForEach-Object {
$DestDir = Join-Path $dir $matches[1]
If (!(Test-Path $DestDir)) {mkdir $DestDir|Out-Null}
$_|Move-Item -Destination $DestDir
}