2014-02-26 72 views
-1

我發現了一些類似的問題在Stackoverflow,並嘗試瞭解決方案後,我的問題仍未解決。腳本移動子級文件夾一級(批量或PowerShell)

這裏是我的目錄結構:

d:\ XYZ \亞當周杰倫\亞當周杰倫\ files.txt

d:\ XYZ \亞當周杰倫\亞當周杰倫\ SomeFolder \

d:\ XYZ \亞當周杰倫\亞當周杰倫\ OtherFolder \有些FILE.DOC

d:\ XYZ \ Mary Poppins的\ Mary Poppins的\ myOtherFile.txt

和我有大約2000這些。

我的目標是簡單地刪除冗餘的子子文件夾,遵循上述結構。手動操作,我會簡單地將「sub-sub」文件夾「Adam Jay」剪切並粘貼到XYZ中,在那裏它將替換或合併上層的「Adam Jay」(移動任何文件和文件夾)。

期望的結果:

d:\ XYZ \亞當周杰倫\ files.txt

d:\ XYZ \亞當周杰倫\ SomeFolder \

d:\ XYZ \亞當周杰倫\ OtherFolder \有些FILE.DOC

d:\ XYZ \ Mary Poppins的\ myOtherFile.txt

我對批處理腳本知之甚少,對PowerShell也一無所知。通過修改我在StackOverflow上找到的腳本,我設法搞砸了(幸運的是,它是一個測試目錄)。 [我玩過的腳本可以在這裏找到: PowerShell Script to move folders one level up and delete the previous containing folder]

這將是偉大的,如果任何人都可以幫助我與此。我真的很感激。

謝謝。

+0

D:\ XYZ中是否存在所有文件夾? –

+0

[對不起,我是StackOverflow的新用戶,只收到昨天的通知。] 是的,所有文件夾位於D:\ XYZ。 – verph

回答

0

這應做到:

@echo off 
setlocal enabledelayedexpansion 

cd /d D:\XYZ 
for /f "tokens=*" %%a in ('dir /b /ad') do (
    if exist "%%a\%%a" (
    xcopy /E "%%a\%%a\*" "%%a" 
    rd /s /q "%%a\%%a" 
) 
) 
+0

這工作很好。非常感謝你。至於@ TheMadTechnician的另一個解決方案,我還沒有嘗試過。這更簡單,對於我的3000多個文件夾運行良好,但我很欣賞他的幫助。 – verph

0

,我會去PowerShell的路線。這有兩個選項,默認情況下它會刪除任何雙重文件夾,以便...
Z:\ XYZ \李四\李四\我的文檔\東西\東西\ ItsAFile.txt
變爲:
Z:\ XYZ \ John Doe \ My Documents \ Stuff \ ItsAFile.txt
如果您只想擺脫第6行的第一個重複文件夾註釋,並取消註釋第7行。如果您不喜歡報告部分,請刪除/註釋寫入輸出行。

$BasePath = "D:\XYZ" 
gci $BasePath -recurse | %{ 
    $OriginalFile = $_ 
    If($OriginalFile.PSIsContainer){$FilePath = $_.FullName.ToString().Split('\')} 
    Else{$FilePath = $_.Directory.ToString().Split('\')} 
    for($i=1;$i -lt $FilePath.Count;$i++){ #Comment out this line to change to Base Path +2 folders method 
# for($i=0;$i -lt $($BasePath.Split('\').Count +2);$i++){ #Uncomment to only affect the first 2 folders past the base path 
     if($filepath[$i] -and ($FilePath[$i] -ieq $FilePath[$i-1])){ 
      $FilePath[$i-1] = $Null 
     } 
    } 
    ($FilePath|?{$_}) -join '\'|%{ 
     if($OriginalFile.PSIsContainer){ 
      If(!($OriginalFile.FullName -ieq $_)){ 
      Write-Output "Moving folder $($OriginalFile.fullname) to $_" 
      move-item "$($OriginalFile.fullname)\*" $_ -ErrorAction SilentlyContinue 
      Remove-Item $OriginalFile.fullname -ErrorAction SilentlyContinue} 
     }else{ 
      If(!($OriginalFile.Directory.ToString() -ieq $_)){ 
      Write-Output "Moving file $($OriginalFile.fullname) to $(Resolve-Path "$_\..")" 
      move-item $OriginalFile.fullname "$_\.." -ErrorAction SilentlyContinue 
     }} 
    } 
} 

若要單步的是,它:

  1. 拉在基路徑中的每個文件夾或文件的目錄列表。

  2. 對於每一個它分開基於反斜槓字符, (不包括文件名稱)的路徑。

  3. 然後它在每個文件夾中將每個文件夾與其前一個文件夾 進行比較(或者如果 轉到該路徑,則僅對前幾個片段進行步驟)。

  4. 如果兩個順序文件夾匹配,則刪除第一個文件夾。

  5. 然後重建該過程結束時的路徑。

  6. 之後,它將修改後的路徑與原始路徑進行比較,如果它們不同,則將它移動到修改後的路徑。

它不同地處理文件和文件夾,因爲它使用文件夾的.FullName屬性和文件的.Directory屬性。

相關問題