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)
我正在尝试使用 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)