2013-07-22 57 views
0

我正在編寫一個將圖像(jpg)從一個位置移動到另一個位置的計劃腳本。 問題是,父目錄的名稱是可變的,而最終目錄是固定的。使用變量目錄下的PowerShell腳本移動jpg's

如果robocopy會這樣做,我會很高興:robocopy C:\ temp \ pcbmodel ** \ defect c:\ test ** \ defect *。但事實並非如此

例如這幾乎工作:

foreach ($i in Get-ChildItem C:\temp\pcbmodel\*\*\defect -recurse) 
{ 
if ($i.CreationTime -lt ($(Get-Date).AddMonths(0))) 
{ 
    write $i.FullName 
    Copy-Item $i.FullName C:\Test 
} 
} 

的問題是,該文件位於C複製:\測試,但在**路是沒有的。我需要的路徑,因爲它會改變每個客戶。

一些建議就好了, 伯特

+0

究竟是什麼阻止你做'robocopy C:\ temp \ pcbmodel C:\ test * .jpg/s'? –

回答

1

這應該讓您找到正確的途徑獲得工作解決方案。重要的部分是Resolve-Path cmdlet,它採用-Relative參數:http://technet.microsoft.com/en-us/library/hh849858.aspx。 new-Item -Force只是告訴它創建一個文件夾結構,如果需要的話。

# $OldRoot = 'Top-level of old files' 
# $DestRoot = 'Top-level of destination' 
# Go to old root so relative paths are correct 
Set-Location $OldRoot 
# Get all the images, then for each one... 
Get-ChildItem -Recurse -Include "*.jpeg", "*.jpg" | 
ForEach-Object { 
     # Save full name to avoid issues later 
     $Source = $_.FullName 

     # Construct destination filename using relative path and destination root 
     $Destination = '{0}\{1}' -f $DestRoot, (Resolve-Path -Relative -Path:$Source).TrimStart('.\') 

     # If new destination doesn't exist, create it 
     If(-Not (Test-Path ($DestDir = Split-Path -Parent -Path:$Destination))) { 
      New-Item -Type:Directory -Path:$DestDir -Force -Verbose 
     } 

     # Copy old item to new destination 
     Copy-Item -Path:$Source -Destination:$Destination -Verbose 
} 
+0

謝謝,但我無法得到這個工作。一些額外的幫助。我不知道如何分離根源。請解釋「{0} \ {1}」-f $ DestinationRoot,(Resolve-Path -Relative -Path $ _)。謝謝 – user2606845

+0

這是powershell字符串格式化程序; https://devcentral.f5.com/blogs/us/powershell-abcs-f-is-for-format-operator有一個很好的解釋。 – Eris

+0

謝謝。現在我只需要刪除。 ?任何想法? PS C:\ temp> C:\ Temp \ test3.ps1 c:\ test \。\ pcbmodel \ help1 \ help2 \ defect c:\ test \。\ pcbmodel \ help1 \ help2 \ defect \ t.jpg – user2606845

0

如何類似的東西:

$step1 = get-childitem C:\temp\pcbmodel\ 
$Else = #FILETYPE YOU DO NOT WANT 
$step1 | foreach {get-childitem -recurse -exclude "Directories", $ELSE | where {$_.Creationtime -lt ($(get-date).Addmonths(0))} 
       } 

希望我得到它的權利,這有助於:)

編輯:用-Exclude工作-Include參數他們幫助很多:)

編輯2:Ofc,我重讀了一些內容,對很多編輯抱歉 - 您只是在尋找jpg文件。

$step1 | foreach {get-childitem -recurse -include *.jpg, *.jpeg | where {$_.Creationtime -lt ($(get-date).Addmonths(0))} 
+0

嗨,謝謝,但問題不在於獲取文件,而是將它們放在相應的目錄中。因此原始地圖可以是:c:\ temp \ pcbmodel \ customerA \ Files \ Defect \ images.jpg。它需要被移動到d:\ archive \ pcbmodel \ customerA \ Files \ Defect \ images.jpg。我無法獲取保存原始路徑的不同目錄中的文件...請告訴我它是否清除(或不清除)。謝謝! – user2606845

+0

增加了一個新的回答,因爲它與這個完全不同。希望這有助於:) – XXInvidiaXX

0

另一個想法: 不要試圖在你C:盤。它將永遠需要。但是,如果你有權限每個目錄和子目錄在一個特定的路徑和子目錄數量不是很大,它應該工作。

我在C盤上創建了一個目錄「New Directory」,在這個目錄下創建了另一個「New Directory」。而且,另一個「新目錄」在目錄中。 ,最後我創建了一個文件名爲 「superduper.txt」 - > C:\新目錄\新目錄\新目錄\ superduper.txt

(get-childitem C:\).FullName | where {(Get-ChildItem $_).FullName | where {(get-childitem $_ -Recurse).FullName -match "superduper"}} 

結果:

C:\New Directory 

我想它不會很快,你會需要其中2個來實現你的目標,我想它應該工作。

0

我試圖將所有子文件夾及其文件從一個文件夾複製到另一個文件夾,而不復制它們的父文件夾。

例如,在C:\test中有一些包含文件的子文件夾,請複製到D:\test而不是D:\test\test\subfolders