2017-10-26 22 views
0

私は、ディレクトリ構造を平坦化し、その中に含まれるすべてのファイルをコピーするPowerShellスクリプトを用意しています。コピーで複製アイテムを保持/名前を変更

ls $srcdir -Recurse | Where-Object { 
    $_.PSIsContainer -eq $false 
} | foreach($_) { 
    cp $_.Fullname $destdir -Force -Verbose 
} 

私はこれをとり、それを関数に入れました。

function mcopy($srcdir, $destdir) { 
    ls $srcdir -Recurse | Where-Object { 
     $_.PSIsContainer -eq $false 
    } | foreach($_) { 
     cp $_.Fullname $destdir -Force -Verbose 
    } 
} 

私は現在、機能内で重複するファイル名を処理するための良い方法を探しています。 「ハンドル」とは、そのファイル名を持つファイルがすでに宛先ディレクトリに存在する場合、ファイル名に数字を追加してファイル名を徐々に変更することを意味します。

私は私の検索でこの出くわし:

$SourceFile = "C:\Temp\File.txt" 
$DestinationFile = "C:\Temp\NonexistentDirectory\File.txt" 

if (Test-Path $DestinationFile) { 
    $i = 0 
    while (Test-Path $DestinationFile) { 
     $i += 1 
     $DestinationFile = "C:\Temp\NonexistentDirectory\File$i.txt" 
    } 
} else { 
    New-Item -ItemType File -Path $DestinationFile -Force 
} 

Copy-Item -Path $SourceFile -Destination $DestinationFile -Force 

私は、これらのスクリプトの両方でコンセプトを統一しようとしていますが、私はこれまでのところ成功していません。

function mcopy($srcdir, $destdir) { 
    ls $srcdir -Recurse | Where-Object { 
     $_.PSIsContainer -eq $false 
    } | foreach($_) { 
if (Test-Path $_.fullname) { 
    $i = 0 
    while (Test-Path $_.fullname) { 
     $i += 1 
     $DestinationFile = "C:\Temp\NonexistentDirectory\File$i.txt" 
    } 
} else { 
    New-Item -ItemType File -Path $_.fullname -Force 
} 

Copy-Item -Path $SourceFile -Destination $_.fullname -Force 
    } 
}  

私は何かを明らかに行方不明ですか、私はどこかに起因する誤解を明らかに間違って何かをやったと思います。

作業代替ソリューション(robocopyまたはその他)は、ディレクトリ構造を平坦化し、重複するファイル名をうまく処理する限り、受け入れられます(上記の「ウェル」の定義を参照してください)。

+1

*これまでに失敗しています。あなたが試したこと、そしてそれがいかに正確に失敗したかを表示してください。あなたが望むのは、ForEach-Object'ループで最後のコードスニペットをネストする以上のものではありません。 –

+0

スクリプトを合理化するために '$ _ 'を使うのが大好きですが、複数の入力があるので混乱するかもしれません。 $ srcdirでTest-Pathを使いたいと思っていますか?混乱を避けるために、変数を明示的に呼び出していることを確認してください。論理はすべて私の見解から響きます。 –

答えて

0

私がこの質問をしたときに私が受け取ったアドバイスのおかげで、私はいくつかの単純なエラーを見出していました。ちょっとだけスクリプトを細かく修正する必要がありました。

修正されたスクリプトは以下のとおりです。これまでのところ、より小さなデータセットの取り扱いを行ってきました。私はすぐにいくつかの大きなディレクトリでそれをテストします!

function mcopy($srcdir,$destdir) 
{ 
ls $srcdir -recurse | Where-Object { $_.PSIsContainer -eq $false } | foreach($_) { 
$SourceFile = $_.FullName 
$DestinationFile = $destdir+$_ 
If (Test-Path $DestinationFile) { 
    $i = 0 
    While (Test-Path $DestinationFile) { 
     $i += 1 
     $DestinationFile = $destdir+$_+$i 
    } 
} Else { 
    New-Item -ItemType File -Path $DestinationFile -Force 
} 
Copy-Item -Path $SourceFile -Destination $DestinationFile -verbose -Force 
} 
} 

mcopy -srcdir C:\copyme\ -destdir C:\copyharder\ 
関連する問題