Powershell通过网络复制文件

时间:2014-05-27 09:32:45

标签: powershell copy

尝试将一些文件从服务器本地复制到网络共享,如下图所示:

文件夹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,但是这个复制项目需要文件夹以及月份名称(如" May"),这是robocopy无法提供的,所以我有切换到powershell脚本并结合robocopy。

关于如何创建更好的脚本的任何想法?

1 个答案:

答案 0 :(得分:13)

使用复制项目。如果您正在使用真正的镜像,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意味着没有变化。