[英]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.