RoboCopy在通用文件路径中给出错误

时间:2017-08-15 08:25:24

标签: windows powershell cmd scripting robocopy

我正在进行一些Arduino HID研究。 我试图将我的Leo设置为打开powershell并将我的Documents文件夹中的所有.pdfs备份到按卷名称的闪存驱动器。

我希望这可以移植到不同的机器上。因此,不能使用包含用户名的指定文件路径。

我找到的原始脚本是这个。

    param([parameter(mandatory=$true)]$VolumeName,
      [parameter(mandatory=$true)]$SrcDir)

# find connected backup drive:
$backupDrive = $null
get-wmiobject win32_logicaldisk | % {
    if ($_.VolumeName -eq $VolumeName) {
        $backupDrive = $_.DeviceID
    }
}
if ($backupDrive -eq $null) {
    throw "$VolumeName drive not found!"
}

# mirror 
$backupPath = $backupDrive + "\"
& robocopy.exe $SrcDir $backupPath /MIR /Z

我遇到的问题是,当我通过C:\users\$env:username\Documents\的路径时 Powershell引发错误说明。

"ERROR 123 (0x0000007B) Accessing Source Directory C:\Users\$env:USERNAME\Documents\
The filename, directory name, or volume label syntax is incorrect."

接下来我尝试删除$ srcDIR参数并使用新脚本指定变量中的路径,如下所示:

param([parameter(mandatory=$true)]$VolumeName)
 $backupDrive = $null
 get-wmiobject win32_logicaldisk | % {
   if ($_.VolumeName -eq $VolumeName) {
       $backupDrive = $_.DeviceID
    }
 } 
 $backupPath = $backupDrive + "\"

$source=@($env:username + "\Documents\")
$destination=@($backupPath)

robocopy $source  $destination *.pdf /mir /z

那失败了也给了我另一个路径错误显然robocopy正在两次看到我的用户名:

    -------------------------------------------------------------------------------
   ROBOCOPY     ::     Robust File Copy for Windows
-------------------------------------------------------------------------------

  Started : Tuesday, August 15, 2017 3:49:04 AM
   Source : C:\Users\me\me\Documents\
     Dest = F:\

    Files : *.pdf

  Options : /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /Z /R:1000000 /W:30

------------------------------------------------------------------------------

2017/08/15 03:49:04 ERROR 3 (0x00000003) Accessing Source Directory C:\Users\damav\damav\Documents\
The system cannot find the path specified.

所以我编辑了最后一行,包括一个直接路径,没有变量。

robocopy C:\Users\$env:username\Documents\  $backupDrive *.pdf /mir /z 

输出产生了不同的结果,使我比其他问题更困惑。看看:

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Robust File Copy for Windows
-------------------------------------------------------------------------------

  Started : Tuesday, August 15, 2017 3:55:36 AM
   Source : C:\Users\me\Documents\
     Dest = F:\

    Files : *.pdf

  Options : /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /Z /R:1000000 /W:30

------------------------------------------------------------------------------

                           0    C:\Users\me\Documents\
                           0    C:\Users\me\Documents\My Music\
          New Dir          0    C:\Users\me\Documents\My Pictures\
2017/08/15 03:55:36 ERROR 5 (0x00000005) Time-Stamping Destination Directory F:\My Pictures\
Access is denied.
Waiting 30 seconds... Retrying...
2017/08/15 03:56:07 ERROR 5 (0x00000005) Time-Stamping Destination Directory F:\My Pictures\
Access is denied.
Waiting 30 seconds...

之所以如此令人困惑的原因是因为robocopy试图复制的这些目录在我的文档文件夹和闪存驱动器中都不存在。 C:\用户\我\文件\

C:\ Users \ me \ Documents \ My Music \                    C:\ Users \ me \ Documents \ My Pictures \                    F:\ My Pictures \

所以我完全难过,来到这里向专业人士寻求帮助。 我还使用上面所述的相同脚本变体在文件路径中尝试了%USERNAME%%USERPROFILE%,但由于robocopy假设它们是实际路径名的一部分,因此无法正常工作。 I.E. C:users\%USERPROFILE%\Documents

总而言之,我需要能够将命名的卷闪存驱动器插入我的电脑。 插入我的Arduino让它在CMD,POWERSHELL中键入命令,或在记事本中创建.ps1但我遇到的问题是在路径中不使用特定用户名时无法识别源目录路径由于我需要在机器和用户之间使用便携式设备。

2 个答案:

答案 0 :(得分:1)

  

问题1:
  我遇到的问题是,当我通过C:\ users \ $ env:username \ Documents \ Powershell的路径时,会抛出一个错误说明。

只是假设,但这听起来像是一个关于如何传递路径的问题。请看下面的代码:

'C:\users\$env:username\Documents\'
"C:\users\$env:username\Documents\"

这两行都生成一个字符串,但只有第二行“转换”为正确的路径。 Powershell区分正常引号(“)和单引号(')。有关详细信息,请参阅About Quoting Rules

使用源目录的常规引号,脚本在我的测试中完全正常。

  

问题2:
  接下来我尝试删除$ srcDIR参数并使用新脚本在变量中指定路径,如下所示:   那失败了也给了我另一个路径错误显然robocopy正在两次看到我的用户名:

您的问题是$ env:用户名只包含您的用户名,具体取决于您启动脚本的位置,您的代码行为会有所不同。从C:\ users \ me开始,它转换为C:\ users \ me \ me \ documents,你是否会在C:\ users中转换为C:\ uses \ me \ documents,它可能有效。而不是使用$ env:username的硬编码路径,我会使用:

"$env:USERPROFILE\Documents"
  

问题3:   它之所以令人困惑的原因是因为robocopy试图复制的这些目录在我的文档文件夹和闪存驱动器中都不存在。 C:\用户\我\文件\

robocopy错误告诉您它无法在您的目标上写入,可能是权限/文件系统(NTFS到FAT32?)问题。确保您可以在闪存驱动器上写入。 例如首先尝试在没有PowerShell脚本的情况下直接使用robocopy进行编写

robocopy C:\users\me\Documents\ F:\ *.pdf /MIR /Z

答案 1 :(得分:0)

更改短文件名的注册表项作为最佳实践分析器中建议的清理的一部分。它告诉我要修改的关键是这个。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\  NtfsDisable8dot3NameCreation

它默认为 2,我已根据 BPA 将其更改为 1。我回去把它改回 2 并重新运行 robocopy 脚本,没有错误。

只是想让人们知道什么对我有用:

reg add HKLM\SYSTEM\CurrentControlSet\Control\FileSystem  /v NtfsDisable8dot3NameCreation /t REG_DWORD /d 2 /f

我的 Windows 10 1909 (18363.778) 默认为 0。我只是设置了 2,现在它就像一个魅力。