使用Powershell复制文件到网络中

16

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

文件夹 1

enter image description here

文件夹 2

enter image description here

我想要实现的是将源文件夹中ROOT文件夹的所有内容复制到目标文件夹中。但每次复制内容时,我希望它创建一个新的文件夹,名称与目标文件夹相同,但具有某种顺序编号后缀。源/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个回答

25

使用Copy Item。在我的经验中,如果您只是进行真正的镜像操作,Robocopy很酷,但对于大多数情况,使用PowerShell中的Copy Item更好。如果您想要一个唯一的名称,请创建一个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表示没有更改。


1
谢谢Jason。那些命令对我很有用,让我不用使用冗长的脚本。但是我仍然喜欢使用Robocopy进行复制部分,只是个人偏好 :) - user3679127
如果我的回答解决了你的问题,请随意将其标记为答案,很高兴能够帮助你。我现在大多使用Windows上的PowerShell。但是,我自己有时仍然使用ROBOCOPY,主要是为了/MIR开关。 - Jason Hughes
嗨@JasonHughes; Copy-Item -Path $SharedSource -Destination $Destination -Recurse -Force 对我来说效果很好。请注意-Recurse标志和排除/*.* - Aakash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接