2013-07-24 7 views
15

私は実際には以下のスクリプトを作成するのに苦労しています。フォルダとサブフォルダ内のファイルを適切な構造)。Copy-item Powershellを使用してソースサーバと同じディレクトリ構造のフォルダとサブフォルダ内のファイル

メインフォルダ:

は、下記のフォルダがある、と言うことができますファイル:3

サブフォルダBファイル、ファイル1、ファイル2:ファイルAAA、ファイル

BBBはサブフォルダ4、ファイル5、6

スクリプトを使用したファイル:

Get-ChildItem -Path \\Server1\Test -recurse | ForEach-Object { 
Copy-Item -LiteralPath $_.FullName -Destination \\server2\test | 
Get-Acl -Path $_.FullName | Set-Acl -Path "\\server2\test\$(Split-Path -Path $_.FullName -Leaf)" 

} 

出力: ファイルAAA、

サブBBBファイル6ファイル、5ファイル、(空のフォルダ)

サブフォルダB(空のフォルダ)

ファイル1、ファイル2フォルダ3ファイル、4ファイル。

ファイルをそれぞれのフォルダにコピーしたい(ソースフォルダのように)。それ以上の援助は高く評価されます。

+0

あなたはすべてをコピーしたい場合は、Kevin_の答えは動作するはずです。入力をフィルタリングする必要がある場合は、http://stackoverflow.com/questions/17788208/moving-jpgs-using-powershell-script-with-variable-directories – Eris

+0

を参照してください。powershellの** robocopy **を使用した完全なサンプル? – Kiquenet

答えて

41

これは、Copy-Itemを使用して行うことができます。 Get-Childitemを使用する必要はありません。私はあなたがちょうどそれを思っていると思う。

Copy-Item -Path C:\MyFolder -Destination \\Server\MyFolder -recurse -Force 

私はちょうどそれをテストし、それは私のために働いた。

+20

複数回実行すると、このコマンドの動作が変わることがわかりました。初めて、すべてを\\ Server \ MyFolderにコピーします。 2回目以降は\\ Server \ MyFolder \ MyFolderにすべてをコピーします – thecodefish

+0

@thecodefishこれも気付きましたが、ターゲットディレクトリが存在しない場合にのみ発生します。新しい項目-ItemTypeディレクトリを使用する-Path $ target -Force | Out-Nullが問題を解決します。 -Forceスイッチはディレクトリが存在しない場合にのみディレクトリを作成し、Out-Nullは出力を汚染しません。 – Indy411

+0

'Copy-Item **/*。txt -Destination C:/ destination'のようなパターンマッチングでも動作します。 –

-2

特定の日付と時刻の後に変更されたファイルをコピーするソリューションが必要でした。これは、フィルターを介してGet-ChildItemをパイプする必要があることを意味します。以下は私が思いついたものです:

$SourceFolder = "C:\Users\RCoode\Documents\Visual Studio 2010\Projects\MyProject" 
$ArchiveFolder = "J:\Temp\Robin\Deploy\MyProject" 
$ChangesStarted = New-Object System.DateTime(2013,10,16,11,0,0) 
$IncludeFiles = ("*.vb","*.cs","*.aspx","*.js","*.css") 

Get-ChildItem $SourceFolder -Recurse -Include $IncludeFiles | Where-Object {$_.LastWriteTime -gt $ChangesStarted} | ForEach-Object { 
    $PathArray = $_.FullName.Replace($SourceFolder,"").ToString().Split('\') 

    $Folder = $ArchiveFolder 

    for ($i=1; $i -lt $PathArray.length-1; $i++) { 
     $Folder += "\" + $PathArray[$i] 
     if (!(Test-Path $Folder)) { 
      New-Item -ItemType directory -Path $Folder 
     } 
    } 
    $NewPath = Join-Path $ArchiveFolder $_.FullName.Replace($SourceFolder,"") 

    Copy-Item $_.FullName -Destination $NewPath 
} 
0

同じコンテンツをソースからコピー先にミラーリングする場合は、次のようにしてください。

function CopyFilesToFolder ($fromFolder, $toFolder) { 
    $childItems = Get-ChildItem $fromFolder 
    $childItems | ForEach-Object { 
     Copy-Item -Path $_.FullName -Destination $toFolder -Recurse -Force 
    } 
} 

テスト:

CopyFilesToFolder "C:\temp\q" "c:\temp\w" 
関連する問題