Powershell-从文件名创建一个文件夹,然后将该文件放在文件夹中

Bri*_*her 2 directory powershell naming file

我有一个文件列表说...

T123_Product_1.jpg
T123_Product_2.jpg
T123_Product_3.jpg
T456_Product_1.jpg
T456_Product_2.jpg
T456_Product_3.jpg 
Run Code Online (Sandbox Code Playgroud)

等等等等等等大约另外900个文件

我需要做的是根据第一个下划线之前的字符创建一个文件夹,但由于有多个文件,因此不再重复。

因此,在上面的示例中,我只需要两个名为T123和T456的文件夹。

然后,我需要脚本将适当的文件放置在文件夹中。

我在此线程中找到了一些代码,但是它们并不能完全满足我的要求。

https://superuser.com/questions/306890/windows-batch-script-to-create-folder-for-each-file-in-a-directory-name-it-tha

    $Files = Get-ChildItem -Path 'C:\Info\AUGUST 2011\Checklists\' -Filter 'DET1__*'
$Files | ForEach-Object {
    $FileFullName = $_.FullName
    $TempFileName = "$($FileFullName).tmp"
    $DestinationFileName = "$FileFullName\$($_.Name)"
    Move-Item $FileFullName $TempFileName
    New-Item -Path $FileFullName -ItemType Directory
    Move-Item $TempFileName $DestinationFileName
}
Run Code Online (Sandbox Code Playgroud)

有什么帮助吗?

Joe*_*oey 5

这里最简单的方法是按第一部分对文件进行分组,然后将其变为目录名。在典型的PowerShell管道方式中,这非常简洁:

Get-ChildItem -File |  # Get files
  Group-Object { $_.Name -replace '_.*' } |  # Group by part before first underscore
  ForEach-Object {
    # Create directory
    $dir = New-Item -Type Directory -Name $_.Name
    # Move files there
    $_.Group | Move-Item -Destination $dir
  }
Run Code Online (Sandbox Code Playgroud)


Dub*_*sor 5

也试试。

cd <path to your folder>
  $files = Get-ChildItem -file;
  ForEach ($file in $files)
  {
    $folder = New-Item -type directory -name ($file.BaseName -replace "_.*");
    Move-Item $file.FullName $folder.FullName;
  }
Run Code Online (Sandbox Code Playgroud)

您也可以在 $file.BaseName 上使用 Substring 方法。

cd <path to your folder>
$files = Get-ChildItem -file;
ForEach ($file in $files)
{
  $fileName = $file.BaseName;
  $folder = New-Item -type directory -name $fileName.Substring(0, $fileName.Length-10);
  Move-Item $file.FullName $folder.FullName;
}
Run Code Online (Sandbox Code Playgroud)

同样贴在这里,并附有解释。