2015-12-22 182 views
2

我是一名初級技術人員,一直負責撰寫簡短的powershell腳本。問題是我5小時前開始學習PS - 一旦我的老闆告訴我被分配到這個任務。我有點擔心它不會在明天完成,所以希望你們能幫助我一點。任務是:移動具有相同名稱但擴展名不同的文件。 Powershell

我需要將文件移動到根據某些條件不同的文件夾,讓我從他的文件夾結構開始:

c:\LostFiles: This folder includes a long list of .mov, .jpg and .png files 
c:\Media: This folder includes many subfolders withe media files and projects. 

工作是從C移動文件:\ LostFiles到如果

來自c:\ LostFiles的文件的名稱對應於C:\ media的子文件夾中的文件名我們必須忽略擴展名,例如:

C:\ LostFiles有這些文件,我們n EED移動(如果可能):imageFlower.png,videoMarch.mov,danceRock.bmp

C:\媒體\花\早已這個文件:imageFlower.bmp,imageFlower.mov

imageFlower.png應被移動到這個文件夾(C:\ media \ Flowers),因爲存在或者存在具有完全相同基本名稱的文件(擴展名必須被忽略)

只有具有相應文件(相同名稱)的文件應該是移動。

到目前爲止,我已經寫了這段代碼(我知道它不是很多,但是現在我正在更新這段代碼(格林威治標準時間21:45),我知道我錯過了一些循環,嘿耶,我我錯過了很多

#This gets all the files from the folder 
$orphans = gci -path C:\lostfiles\ -File | Select Basename 

#This gets the list of files from all the folders 
$Files = gci C:\media\ -Recurse -File | select Fullname 

#So we can all the files and we check them 1 by 1 
$orphans | ForEach-Object { 

#variable that stores the name of the current file 
    $file = ($_.BaseName) 

#path to copy the file, and then search for files with the same name but only take into the accont the base name   
     $path = $Files | where-object{$_ -eq $file} 

#move the current file to the destination 
     move-item -path $_.fullname -destination $path -whatif 

     } 

回答

0

你可以建立從媒體文件的哈希表,然後通過丟失的文件迭代,看看是否丟失的文件的名字是在散喜歡的東西:。

# Create a hashtable with key = file basename and value = containing directory 
$mediaFiles = @{} 
Get-ChildItem -Recurse .\Media | ?{!$_.PsIsContainer} | Select-Object BaseName, DirectoryName | 
ForEach-Object { $mediaFiles[$_.BaseName] = $_.DirectoryName } 

# Look through lost files and if the lost file exists in the hash, then move it 
Get-ChildItem -Recurse .\LostFiles | ?{!$_.PsIsContainer} | 
ForEach-Object { if ($mediaFiles.ContainsKey($_.BaseName)) { Move-Item -whatif $_.FullName $mediaFiles[$_.BaseName] } } 
+1

哇,這太神奇了,它效果很好!謝謝!我不明白這一點:** Move-Item -whatif $ _。FullName $ mediaFiles [$ _。Ba seName]} **。爲什麼只有在需要指定目標文件夾時才調用.BaseName? – Okrx

+0

對不起,直接問你,但你似乎也必須知道這個問題的答案:我們如何生成一個文件已被移動到新位置的報告? – Okrx

+0

BaseName是散列表中的鍵,返回的值是要將其移動到的目錄。 – dugas

相關問題