Powershell通过网络复制文件

use*_*127 10 powershell copy

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

文件夹1

在此输入图像描述

文件夹2

在此输入图像描述

我需要实现的是将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
 }
Run Code Online (Sandbox Code Playgroud)

我最初只是为了类似的目的使用robocopy,但是这个复制项目需要文件夹以及它的月份名称(如"May"),这是robocopy所不具备的,所以我不得不切换到powershell脚本并结合robocopy .

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

Jas*_*hes 16

使用复制项目.如果您正在使用真正的镜像,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
Run Code Online (Sandbox Code Playgroud)

此外,如果您坚持使用RoboCopy,如果在其他工具(如TeamCity)内部运行,则需要检查退出级别.

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

根据错误级别创建实际错误代码.对于RoboCopy,ErrorLevel 1实际上意味着成功,0意味着没有变化.