Powershell - 从文件名创建一个文件夹,然后将该文件放在该文件夹中
Powershell - Create a folder from a file name, then place that file in the folder
我有一个文件列表说...
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 的文件夹。
然后我需要脚本将适当的文件放入文件夹中。
我在此线程中找到了一些代码,但它们并不完全符合我的要求。
$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
}
有什么帮助吗?
这里最简单的方法是分组文件的第一部分,这将成为目录名称。在典型的 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
}
$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)" }
也试试。
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.
我有一个文件列表说...
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 的文件夹。
然后我需要脚本将适当的文件放入文件夹中。
我在此线程中找到了一些代码,但它们并不完全符合我的要求。
$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
}
有什么帮助吗?
这里最简单的方法是分组文件的第一部分,这将成为目录名称。在典型的 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
}
$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)" }
也试试。
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.