web-dev-qa-db-ja.com

ネットワーク経由でファイルをコピーするPowershell

以下の画像に示すように、サーバーからネットワーク共有にいくつかのファイルをコピーしようとしています。

フォルダ1

enter image description here

フォルダ2

enter image description here

達成する必要があるのは、SOURCEの下のROOTフォルダーのすべての内容をDESTINATIONフォルダーにコピーすることです。しかし、コンテンツをコピーするたびに、同じ宛先フォルダー名で、ある種の連番が付いた新しいフォルダーを作成したいと思います。 SOURCE/ROOTフォルダー内のフォルダーとファイルの数は常に同じです(2つのフォルダーと2つのファイル)。スクリプトを実行するたびに、これらすべてのソースコンテンツを宛先の新しいフォルダーに入れるだけです。これは私が試したスクリプトの例ですが、必要なことをしていないだけです。

$date = Get-Date -format MMMM-dd-yyyy
$date2 = Get-Date -format yyyyMMdd

$Source = "C:\SOURCE\ROOT"

$Destination1 = "\\netshare\DESTINATION\DATA_May-26-2014"
$Destination2 = "\\netshare\DESTINATION\DATA_May-26-2014-1st"
$Destination3 = "\\netshare\DESTINATION\DATA_May-26-2014-2nd"
$Destination4 = "\\netshare\DESTINATION\DATA_May-26-2014-3rd"
$Destination5 = "\\netshare\DESTINATION\DATA_May-26-2014-4th"
$Destination6 = "\\netshare\DESTINATION\DATA_May-26-2014-5th"

#Check destination path
if (Test-Path $Destination1)
 {
  #then copy
  robocopy $Source $Destination2 /MIR /Z /E /fft /MAXAGE:$date2
 }
if (Test-Path $Destination2)
 {
  #then copy
  robocopy $Source $Destination3 /MIR /Z /E /fft /MAXAGE:$date2
 }
if (Test-Path $Destination3)
 {
  #then copy
  robocopy $Source $Destination4 /MIR /Z /E /fft /MAXAGE:$date2
 }
if (Test-Path $Destination4)
 {
  #then copy
  robocopy $Source $Destination5 /MIR /Z /E /fft /MAXAGE:$date2
 }
if (Test-Path $Destination5)
 {
  #then copy
  robocopy $Source $Destination6 /MIR /Z /E /fft /MAXAGE:$date2
 }
else
 {
  robocopy $Source $Destination1 /MIR /Z /E /fft /MAXAGE:$date2
 }

最初は同様の目的でのみrobocopyを使用していましたが、このコピープロジェクトでは、フォルダーに月名を付ける必要があり(「5月」など)、robocopyでは使用できなかったため、powershellスクリプトに切り替えてrobocopyを組み合わせる必要がありました。

より良いスクリプトを作成する方法に関するアイデアはありますか?

9
user3679127

アイテムのコピーを使用します。真のミラーを使用している場合、Robocopyはクールです。私の経験では、コピーアイテムの使用はPowerShellのほとんどの場合に適しています。一意の名前が必要な場合は、TimeStamp変数を作成し、最後に渡すか、同様の変数を渡します。

$TimeStamp = get-date -f yyyyMMddhhmm
$Destination = "\\netshare\DESTINATION\DATA_" + $TimeStamp
New-Item -ItemType directory -Path $Destination -Force
Copy-Item -Path $Source\*.* -Destination $Destination -Force

また、RoboCopyを使用している場合、他のツール(TeamCityなど)の内部で実行している場合は、終了レベルを確認する必要があります。

(ROBOCOPY $Source $Destination /MIR /W:30 /R:10) ^& IF %%ERRORLEVEL%% LEQ 1 exit 0

エラーレベルに基づいて実際のエラーコードを作成します。 RoboCopyの場合、ErrorLevel 1は実際に成功を意味し、0は変更なしを意味します。

15
Jason Hughes