web-dev-qa-db-ja.com

PowerShellで1つのディレクトリから別のディレクトリに一連のファイルを再帰的にコピーする

すべての*.csproj.userファイルをC:\Code\TrunkからC:\Code\F2に再帰的にコピーしようとしています。

例えば:

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

にコピーされます:

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

私の現在の試みは次のとおりです。

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

しかし、私は得る:

What if:ターゲット "Item:C:\ Code\Trunk Destination:C:\ Code\F2\Trunk"で操作 "ディレクトリのコピー"を実行しています。

まず、F2\Trunkという名前の新しいフォルダーにすべてを配置したいのですが、これは間違っています。第二に、どのファイルもリストしません。約10個のファイルをコピーする必要があります。

コマンドの正しい構文は何ですか?ありがとう!

更新:

さて、C:\Code\F2がすでに存在しているという事実と関係があるようです。 notが存在する宛先にファイルをコピーしようとすると、機能します。

宛先にある既存の.csproj.userファイルをoverwriteしたい。

22

これを以前に見ましたが、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
}
3

本当に簡単なのに、皆さんはこれを恐ろしく複雑にしています:

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

Directoryをコピーして、F2に「トランク」ディレクトリを作成します。最上位のTrunkフォルダーの作成を避けたい場合は、PowerShellにコピーするよう指示するのをやめる必要があります。

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

最も投票された答えは単一のファイルタイプに完全に有効ですが、複数のファイルタイプをコピーする必要がある場合は、この目的にぴったりのrobocopyと呼ばれるより便利な機能があります。

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

Jaykulの回答を試しましたが、うまくいきませんでした。動作させるには、以下のように変更する必要がありました。また、動作する前にC:\ Code\F2フォルダーを作成しました。

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

回答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
    }
}
0
Steve