我正在尝试使用运行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”驱动器上有一些超长的目录路径。
答案 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)