2013-07-24 96 views
0

我必須遵循這樣的模式文件夾:重命名文件,包括家長和Grantparent文件夾 - PowerShell的

C:\root folder\grandparent folder\parent folder\00001.pdf 
C:\root folder\grandparent folder\parent folder\00002.pdf 

我想的PDF文件重命名爲類似的根文件夾,文件夾祖父母,父母folder.1 .pdf和根文件夾 - 祖父母文件夾 - 父文件夾.2.pdf等,如果可能的話,將此文件移動到根文件夾級別。

我發現這個PowerShell腳本做了類似的事情,但它只需要父文件夾的名稱。

這是我有:

#######Rename script############# 

$path = Split-Path -parent $MyInvocation.MyCommand.Definition 

Function renameFiles 
{ 
    # Loop through all directories 
    $dirs = dir $path -Recurse | Where { $_.psIsContainer -eq $true } 
    Foreach ($dir In $dirs) 
    { 
    # Set default value for addition to file name 
    $i = 1 
    $newdir = $dir.name + "_" 
    # Search for the files set in the filter (*.pdf in this case) 
$files = Get-ChildItem -Path $dir.fullname -Filter *.pdf -Recurse 
Foreach ($file In $files) 
{ 
    # Check if a file exists 
    If ($file) 
    { 
    # Split the name and rename it to the parent folder 
    $split = $file.name.split(".pdf") 
    $replace = $split[0] -Replace $split[0],($newdir + $i + ".pdf") 

    # Trim spaces and rename the file 
    $image_string = $file.fullname.ToString().Trim() 
    "$split[0] renamed to $replace" 
    Rename-Item "$image_string" "$replace" 
    $i++ 
     } 
    } 
    } 
} 
# RUN SCRIPT 
renameFiles 

回答

0

如果它們都遵循相同的模式,並有在祖父母或根本沒有文件,那麼這是很簡單的:

$root = 'C:\root folder' 

Get-ChildItem -Recurse | 
    ForEach-Object { 
    $parent = $_.Parent 
    $grandparent = $parent.Parent 
    $number = [int]$_.BaseName 

    Move-Item $_ -Destination (Join-Path $root ('{0}-{1}-{2}{3}' -f $grandparent, $parent, $number, $_.Extension)) 
    } 
1

了光@下面是Joye的代碼。我測試了Joye的代碼,它給了我「給定格式不支持」的錯誤。不確定這是否是我的實驗室(Powershell V3)。然後我修改了一些工作在我的實驗室:

get-childitem C:\root folder\grandparent folder\parent folder\*.pdf | 
    % { 

    $ParentOjbect =$_.Directory 
    $Parent =$ParentOjbect.Name 
    $GrandParent = $ParentOjbect.Parent 

    Move-item $_ -Destination (Join-Path C:\root folder ('{0}{1}{2}' -f $GrandParent,$Parent,$_.Name)) 
    } 
0

要獲得大祖父母只需添加:

Get-childitem "Y:\DIR\*" -include *.log -recurse | 
% { 

$nextName = Join-Path -Path 'Y:\DIR\*' -ChildPath $_.name 

while(Test-Path -Path $nextName) 
{ 
    $nextName = Join-Path Y:\DIR ($_.BaseName + "_$num" + $_.Extension)  
    $num+=1 
} 

$ParentOjbect =$_.Directory 
$Parent =$ParentOjbect.Name 
$GrandParent = $ParentOjbect.Parent 
$GreatGran = $GrandParent.Parent 

Copy-item $_ -Destination (Join-Path "Y:\DIR" ('{0}_{1}_{2}_{3}' -f $GreatGran,$GrandParent,$Parent,$_.Name)) 
} 

這真的幫了我。還要感謝彼得修改後的Joye最初創建的腳本。