PowerShell和Robocopy - 尝试将变量文件夹作为目标

时间:2018-01-23 16:32:44

标签: powershell robocopy

我正在尝试使用运行Robocopy *的PowerShell脚本将一些文件备份到新建的目录:

$Timestamp = Get-Date -format ddMMyyyy

$DestFolder = "`"\\NASBOX\Archives\$Timestamp\`""
$SourceFolder = "`"\\DESKTOP\d$`""

ROBOCOPY $SourceFolder $DestFolder /COPYALL /B /R:10 /W:90 /LOG:$Timestamp.txt /FP /TEE

这给了我以下错误:

2018/01/23 16:26:20 ERROR 123 (0x0000007B) Accessing Destination Directory \\NASBOX\Archives\23012018" \COPYALL \B \R:10 \W:90 \LOG:23012018.txt \FP \TEE\
The filename, directory name, or volume label syntax is incorrect.

我尝试了一些不同的方法,包括将参数作为数组传递。我尝试过的每件事都会产生完全相同的错误。

我粗略地理解为什么会发生这种情况,但尽管在网上花了大约两个小时,但我找不到适合我特定环境的解决方案。

我哪里错了?

*我尝试使用Copy-Item,但这台桌面的“D”驱动器上有一些超长的目录路径。

3 个答案:

答案 0 :(得分:1)

您不需要在变量中转义引号就这么努力。 PowerShell为您处理大部分内容。这应该是你需要做的全部:

$Timestamp = Get-Date -Format ddMMyyyy

$SourceFolder = "\\DESKTOP\d$"
$DestFolder = "\\NASBOX\Archives\$Timestamp"

ROBOCOPY $SourceFolder $DestFolder /COPYALL /B /R:10 /W:90 /LOG:$Timestamp.txt /FP /TEE

请注意,目标文件夹不应包含尾随\

TL; DR - 没有必要创建带有嵌入"个字符的字符串以传递给robocopy。只需将变量放在robocopy命令行上,PowerShell就会在必要时自动引用。

答案 1 :(得分:1)

问题是您正在构建的路径中的尾部斜杠:

"\\NASBOX\Archives\23012018\"

这个斜杠正在逃避robocopy的双引号,它看到这条路径在最后包含一个引号:

\\NASBOX\Archives\23012018"

错误消息显示了这一点,但不是很有帮助!要解决此问题,只需从路径中删除尾部斜杠:

$DestFolder = "`"\\NASBOX\Archives\$Timestamp`""

答案 2 :(得分:-1)

Function Copy-File {
    [CmdletBinding()]   
    Param(
        [Parameter(Position=0)]
        [string]$source,
        [Parameter(Position=1)]
        [string]$dest,
        [Parameter(Position=2)]
        [string]$sourcefile,
        [Parameter(Position=3)]
        [ref]$RoboError
        )
    Write-Log -message "Copying $sourcefile from $source to $dest"
    $robotoday=(Get-Date).ToString('yyyyMMdd')
    $logfile = -join($env:systemdrive, '\logs\', $robotoday, '_robocopy.log')
    $what = @("$sourcefile",'/COPY:DAT', '/Z', '/E')
    $options = @("/R:1","/W:1","/TEE","/ETA","/LOG+:$logfile")
    $cmdArgs = @($source,$dest,$what,$options)
    robocopy @cmdArgs
    if ($lastexitcode -gt 7) {
        $RoboError.value=$TRUE
        Write-Log -level 'warn' -message "Robocopy function failed with error: $lastexitcode"
    }
} # End Copy-File

[bool]$RoboError=$FALSE
Copy-File -source $copysource -dest $copydestination -sourcefile '*' -RoboError([ref]$RoboError)