簡體   English   中英

在PowerShell中遞歸地將一組文件從一個目錄復制到另一個目錄

[英]Recursively copy a set of files from one directory to another in PowerShell

我試圖將所有*.csproj.user文件遞歸地從C:\\Code\\Trunk復制到C:\\Code\\F2

例如:

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

將被復制到:

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

我目前的嘗試是:

復制項目 C:\\Code\\Trunk -Filter *.csproj.user -Destination C:\\Code\\F2 -Recurse -WhatIf

但是我得到:

如果:在目標“項目:C:\\Code\\Trunk 目的地:C:\\Code\\F2\\Trunk”上執行“復制目錄”操作。

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

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

更新:

好吧,好像和C:\\Code\\F2已經存在有關。 如果我嘗試將文件復制到存在的目的地,它會起作用。

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

你們把這搞得異常復雜,其實很簡單:

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

將復制Directory ,在 F2 中創建一個“Trunk”目錄。 如果你想避免創建頂級 Trunk 文件夾,你必須停止告訴 PowerShell 復制它:

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

雖然投票最多的答案對單一文件類型完全有效,但如果您需要復制多種文件類型,則有一個更有用的功能,稱為 robocopy 正是為此目的,使用更簡單

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

以前見過這個,我不知道為什么 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
}

我嘗試了 Jaykul 的回答,但對我不起作用。 我必須按如下方式更改它才能使其正常工作。 在它工作之前,我還創建了 C:\\Code\\F2 文件夾。

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

答案 1 看起來不錯,為了我的目的,我更改為Move-Item 但是我發現在它遞歸遍歷的每個文件夾中,它只移動了第一個文件。 下面是我的完整腳本,其中還包括一些 doc 文件到 pdf 的轉換:

$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
    }
}

最近我不得不替換存在於幾個子文件夾中的一個文件,我做了如下。

foreach($file in (Get-ChildItem File_you_want_to_be_copied.txt -Recurse)) {$target=$file.directoryname; Copy-Item -path C:\Source_Path\File_you_want_to_be_copied.txt -Destination $target} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM