【问题标题】:PowerShell and Robocopy - filename incorrect when trying to pass variable folder as destinationPowerShell 和 Robocopy - 尝试将变量文件夹作为目标传递时文件名不正确
【发布时间】:2018-01-23 16:32:44
【问题描述】:

我正在尝试使用运行 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 错误 123 (0x0000007B) 访问目标目录 \\NASBOX\Archives\23012018" \COPYALL \B \R:10 \W:90 \LOG:23012018.txt \FP \球座\
文件名、目录名或卷标语法不正确。

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

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

我哪里错了?

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

【问题讨论】:

  • 您的错误在文件夹末尾有一个引号,但没有匹配的打开引号。

标签: powershell robocopy


【解决方案1】:

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

"\\NASBOX\Archives\23012018\"

这个斜线正在转义 robocopy 的双引号,它看到这个路径在末尾包含一个引号:

\\NASBOX\Archives\23012018"

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

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

【讨论】:

  • “引号转义”不是必需的。只需将路径放入变量中,在robocopy 命令行中使用这些变量,PowerShell 会在必要时引用。
【解决方案2】:

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

【讨论】:

    【解决方案3】:
    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      相关资源
      最近更新 更多