2017-06-10 4 views
1

私はpowershellに関しては初心者ですが、最近インフラストラクチャの人向けのスクリプトを作成するように求められました。powershellは、ある場所のファイルを名前に基づいて別の場所に書き込むよりも上に探します。

基本的には、ファイル名のリストがテキストファイルにあります。 ファイルは2つの異なる場所に存在し、locationAとlocationBと言うことができます。ファイルは、フォルダルート内の異なるサブフォルダに置かれている可能性があります。

私がする必要があるのは、テキストファイルにリストされている各ファイルを見つけることです。 locationAにあるファイルを検索し、locationBのファイルを探します。おそらく別のフォルダ構造以上のファイルを探し、locationBに存在するのと同じ場所にファイルを上書きします。

これは配列を使って行う必要があると仮定しています。私が問題を抱えているのは、それぞれの場所でファイルを見つけて、関連するファイル名で上書きすることです。

ご協力いただきますようお願い申し上げます。私はちょうどこのサイトに出くわしたし、将来もっと多くを使うつもりです。これまで

マイコード:

$FileList = 'C:\File_Names.txt' 
$Src ='\\server\Temp' 
$Dst ='\\server\Testing' 

Foreach ($File in $FileList) { 
    Get-ChildItem $Src -Name -Recurse $File 
} 

答えて

2
$FileList = 'C:\File_Names.txt' 
$Src ='\\server\Temp' 
$Dst ='\\server\Testing' 

Get-ChildItem $Src -Recurse -Include (Get-Content $FileList) | ForEachObject { 
    $destFile = Get-ChildItem $Dst -Recurse -Filter $_.Name 
    switch ($destFile.Count) { 
    0 { Write-Warning "No matching target file found for: $_"; break } 
    1 { Copy-Item $_.FullName $destFile.FullName } 
    default { Write-Warning "Multiple target files found for: $_" } 
    } 
} 
  • Get-ChildItem $Src -Recurse -Include (Get-Content $FileList)検索名ファイル$FileList-Includeに含まれる葉の上で動作するファイルのための$Srcのサブツリー([ファイル] - 名前の)コンポーネントのみを受け取り、の配列を受け入れます。デフォルトではが返されます)。

  • Get-ChildItem $Dst -Recurse -Filter $_.Nameは、$Dstのサブツリーを同じ名前のファイル($_.Name)で検索します。この場合は-Filterが使用されることに注意してください。これはパフォーマンス上の理由から推奨されますが、という単一の名前/名前パターンのオプションのみです。

  • switch文は、宛先のサブツリーで正確ファイルが一致した場合にコピーアクションのみが取られることを保証します。

  • Copy-Itemコールでは、ソースと宛先ファイルの.FullNameプロパティにアクセスすると、ファイルが明白に参照されます。

+1

私のスクリプトよりもはるかに効率的です。 +1 – LotPings

+0

@MavCoder:ごめんなさい。何もすぐに気にすることはありません。理想的には、[MCVE(最小、完全、および検証可能な例)](http://stackoverflow.com/help/mcve)を使用して、問題をより詳細に記述する_新しい_質問をすることをお勧めします。 – mklement0

0
$FileList = Get-Content 'C:\File_Names.txt' 
$SrcDir ='\\server\Temp' 
$DstDir ='\\server\Testing' 
Foreach ($File in $FileList) { 
    $SrcFile = Get-ChildItem $SrcDir -Recurse $File -EA SilentlyContinue 
    $DstFile = Get-ChildItem $DstDir -Recurse $File -EA SilentlyContinue 
    if (($Srcfile.count -eq 1) -and ($DstFile.count -eq 1)){ 
     Copy-Item $SrcFile $DstFile 
    } Else { 
     "More/less than one Source and/or Destination file $File" 
    } 
} 
関連する問題