2014-09-12 105 views
11

我試圖將所有*.csproj.user文件從C:\Code\Trunk遞歸複製到C:\Code\F2在PowerShell中遞歸地將一組文件從一個目錄複製到另一個目錄

例如:

C:\Code\Trunk\SomeProject\Blah\Blah.csproj.user

會得到複製到:

C:\Code\F2\SomeProject\Blah\Blah.csproj.user

我現在的嘗試是:

拷貝項目C:\代碼\幹線-Filter * .csproj.user -Destination C:\代碼\ F2 -Recurse -WhatIf

但是我得到:

如果:執行操作 「複製目錄」 目標「項目: C:\代碼\幹線目的地:C :\代碼\ F2 \幹線」。

首先,它想把它們全部放在一個名爲F2\Trunk的新文件夾中,這是錯誤的。其次,它沒有列出任何文件。應該有大約10個文件被複制。

該命令的正確語法是什麼?謝謝!

更新:

好吧,這似乎有事可做的事實,C:\Code\F2已經存在。如果我嘗試將文件複製到而不是存在的目標,它就可以工作。

我想覆蓋任何現有的.csproj.user文件在目的地。

+0

它創建一個新的文件夾中的部分是已經被記錄在案[這裏]一個bug(https://connect.microsoft.com/PowerShell/feedback/details/809855/subfolder-bug-with-command -copy項-C文件夾-C-文件夾2-遞歸 - 完成 - - 更多倍)。 – 2014-09-16 07:32:42

回答

2

以前看過,我不知道爲什麼PowerShell似乎無法正確(恕我直言)。我會做的更麻煩,但它的作品。

$Source = 'C:\Code\Trunk' 
$Files = '*.csproj.user' 
$Dest = 'C:\Code\F2' 
Get-ChildItem $Source -Filter $Files -Recurse | ForEach{ 
    $Path = ($_.DirectoryName + "\") -Replace [Regex]::Escape($Source), $Dest 
    If(!(Test-Path $Path)){New-Item -ItemType Directory -Path $Path -Force | Out-Null 
    Copy-Item $_.FullName -Destination $Path -Force 
} 
+0

我認爲你可以刪除整個正則表達式的東西,如果你使用參數'-LiteralPath'作爲'Copy-Item'命令 – bitbonk 2017-02-23 13:03:33

0

答案1看起來不錯,我改爲Move-Item爲我的目的。但是我發現在每個文件夾中它遞歸地通過,它只移動了第一個文件。下面是我完整的腳本,也包括PDF格式的的DOC文件的一些轉換:

$Source = 'C:\Users\sgrody\Desktop\NSPM-Vol1' 
$MoveFiles = '*.PDF' 
$Dest = 'C:\Users\sgrody\Desktop\MedPassPDF' 
$Folders = Get-ChildItem $Source -Directory -Recurse 


ForEach ($Folder in $Folders) 
{ 
    $wdFormatPDF = 17 
    $word = New-Object -ComObject word.application 
    $word.visible = $false 
    $folderpath = "$($Folder.FullName)\*" 
    $fileTypes = "*.docx","*doc" 
    Get-ChildItem -path $folderpath -include $fileTypes | 
    foreach-object 
    { 
    $path = ($_.fullname).substring(0,($_.FullName).lastindexOf(".")) 
    "Converting $path to pdf ..." 
    $doc = $word.documents.open($_.fullname) 
    $doc.saveas([ref] $path, [ref]$wdFormatPDF) 
    $doc.close() 
    } 
    $word.Quit() 
} 

Get-ChildItem $Source -Filter $MoveFiles -Recurse | ForEach{ 
    $Path = ($_.DirectoryName + "\") -Replace [Regex]::Escape($Source), $Dest 
    If(!(Test-Path $Path)){New-Item -ItemType Directory -Path $Path -Force | Out-Null 
    Move-Item $_.FullName -Destination $Path -Force 
    } 
} 
15

你們使這種令人髮指的複雜的,當它真的很簡單:

Copy-Item C:\Code\Trunk -Filter *.csproj.user -Destination C:\Code\F2 -Recurse 

將複製目錄,在F2中創建一個「Trunk」目錄。如果你想避免創建頂級幹線文件夾,你必須停止告訴PowerShell來複制它:

Get-ChildItem C:\Code\Trunk | Copy -Destination C:\Code\F2 -Recurse -filter *.csproj.user 
+0

第一條命令起作用了,並沒有創建一個'Trunk'。 – CodeMed 2017-04-03 21:36:29

+0

沒有人會夢想第一種方式是「告訴」它複製文件夾,因爲「複製」是「複製項目」的別名,而DOS中的「複製」不能這樣工作,如果我我沒有錯。因此許多人對此產生了困惑和困惑。 – as9876 2017-08-30 16:06:22

1

雖然大多數投票的答案是完全有效的單個文件類型,如果需要複製多個文件類型有一個叫ROBOCOPY更多有用的功能,正是爲了這個目的用更簡單的使用

robocopy C:\Code\Trunk C:\Code\F2 *.cs *.xaml *.csproj *.appxmanifest /s 
0

我試圖Jaykul答案,並沒有爲我工作。我不得不改變它如下來使它工作。在工作之前,我還創建了C:\ Code \ F2文件夾。

Get-ChildItem C:\Code\Trunk Recurse -filter *.csproj.user | Copy -Destination C:\Code\F2 
相關問題