【问题标题】:RoboCopy giving error in universal file pathRoboCopy 在通用文件路径中给出错误
【发布时间】:2018-01-23 03:40:28
【问题描述】:

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

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

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

    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:\Users\me\Documents\

C:\Users\me\Documents\我的音乐\ C:\用户\我\文档\我的图片\ F:\我的图片\

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

因此,总而言之,我需要能够将命名卷闪存驱动器插入我的电脑。 插入我的 Arduino,让它在 CMD、POWERSHELL 中输入命令,或在记事本中创建一个 .ps1,但我遇到的问题是在路径中不使用特定用户名时无法识别源目录路径,这是不可能的由于我需要在机器和用户之间进行移植。

【问题讨论】:

    标签: windows powershell cmd scripting robocopy


    【解决方案1】:

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

    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,现在它就像一个魅力。

    【讨论】:

      【解决方案2】:

      问题 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:username 仅包含您的用户名,这取决于您启动脚本的位置,您的代码的行为会有所不同。从 C:\users\me 开始,它转换为 C:\users\me\me\documents,如果您在 C:\users 中,它会转换为 C:\uses\me\documents 并且它可以工作。我将使用 $env:username 而不是硬编码路径:

      "$env:USERPROFILE\Documents"
      

      问题 3: 之所以如此令人困惑,是因为 robocopy 尝试复制的这些目录不存在于我的文档文件夹或闪存驱动器中。 C:\Users\me\Documents\

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

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

      【讨论】:

      • 关于报价。在我的实际脚本中,文件路径没有附加引号。报价仅适用于帖子。我应该更清楚。当您说脚本运行良好时。您是否提供了 $SrcDir 和确切的文件路径,即 C:users/yourusername/ 或者您是否传递了 $SrcDir 参数 $env:username 或 %USERPROFILE%
      • 您在第二期/声明中回答了这个问题。既然你已经指出了这一点,那就太明显了。
      猜你喜欢
      • 2018-10-12
      • 2023-03-28
      • 2015-01-21
      • 2022-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-21
      相关资源
      最近更新 更多