2017-01-04 30 views
1

我有一個文件列表說......PowerShell的 - 創建從文件名稱的文件夾,然後把該文件夾中

T123_Product_1.jpg 
T123_Product_2.jpg 
T123_Product_3.jpg 
T456_Product_1.jpg 
T456_Product_2.jpg 
T456_Product_3.jpg 

等等等等等約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 
} 

任何幫助嗎?

+0

嗨,你嘗試過什麼? – sodawillow

+0

我在查看這段代碼,發現了另一個線程,但並不完全是這樣。這是上面的代碼所做的。 與文件名的其餘部分(DET1__後)作爲該文件夾的名稱創建一個文件夾 此舉文件保存到特定的文件夾 @sodawillow –

回答

2

這裏最簡單的方法是將組的文件由第一部分組成,然後將成爲目錄名。在典型的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 
    } 
+0

美麗!!!!!! –

0
$directory="c:\temp\" 

#explicit and long version 
Get-ChildItem -File -Path $directory -Filter "*.jpg" | 
ForEach-Object { 
New-Item -ItemType Directory "$directory$($_.Name.Split("_")[0])" -Force; 
Move-Item -Path $_.FullName -Destination "$directory$($_.Name.Split("_")[0])\$($_.Name)"  
} 

#short version 
gci -File -Path $directory -Fi "*.jpg" | 
%{ ni -ItemType Directory "$directory$($_.Name.Split("_")[0])" -Force;mvi $_.FullName "$directory$($_.Name.Split("_")[0])\$($_.Name)" } 
0

也可以嘗試。

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

您也可以在$ 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; 
} 

The same posted here with explanation.

相關問題