PowerShell 和 Robocopy - 尝试将变量文件夹作为目标传递时文件名不正确

PowerShell and Robocopy - filename incorrect when trying to pass variable folder as destination

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

$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\Archives012018" \COPYALL \B \R:10 \W:90 \LOG:23012018.txt \FP \TEE\
The filename, directory name, or volume label syntax is incorrect.

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

我大致理解为什么会这样,但是尽管在网上花了大约两个小时,但我找不到适合我特定情况的解决方案。

我哪里错了?

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

您无需费力地转义变量中的引号。 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 将在必要时自动引用。

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

"\NASBOX\Archives012018\"

这个斜杠正在转义 robocopy 的双引号,它认为这个路径在末尾包含一个引号:

\NASBOX\Archives012018"

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

$DestFolder = "`"\NASBOX\Archives$Timestamp`""
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)