【问题标题】:Copy short 8.3 filename in long mode (Windows)以长模式复制短 8.3 文件名 (Windows)
【发布时间】:2017-09-22 06:42:28
【问题描述】:

试图从命令行复制一个名为“SCOOTE~1.txt”的文件到一个文件夹,其中有一个名为“Scooter - Cosmos.txt”的文件。

问题是副本会将“Scooter - Cosmos.txt”的名称收缩为“Scoote~1.txt”,并询问我是否要覆盖该文件。

如何在不影响其他长名文件的情况下直接复制“SCOOTE~1.txt”?接受外部命令行工具的建议。

【问题讨论】:

  • 您可以使用fsutil file setshortname "Scooter - Cosmos.txt" SCOOTE~2.TXT 更改短名称。否则,您必须将“SCOOTE~1.txt”复制到其他名称。
  • 必须保留原始文件名。无论如何,它们并不冲突。
  • 短名称只是目录中文件的另一个名称。这很像一个硬链接。所以现有的名称确实有冲突
  • @Eryksun 的解决方案将更改Scooter - Cosmos.txt 文件的 名称,使其不再与SCOOTE~1.txt 文件的短/唯一名称冲突。两者的正常可见名称将保持不变。

标签: windows command-line batch-processing short-filenames


【解决方案1】:

问题复现

c:\Test> > "Scooter - Cosmos.txt" echo File with long name
c:\Test> md SFN
c:\Test> > "SFN\SCOOTE~1.TXT" echo File with short name
c:\Test> dir/s/x
 Volume in drive C is OS
 Volume Serial Number is BE3C-8BC1

 Directory of c:\Test

22/09/2017  08:51    <DIR>                       .
22/09/2017  08:51    <DIR>                       ..
22/09/2017  08:50                21 SCOOTE~1.TXT Scooter - Cosmos.txt
22/09/2017  08:51    <DIR>                       Test
               1 File(s)             21 bytes

 Directory of c:\Test\SFN

22/09/2017  08:51    <DIR>                       .
22/09/2017  08:51    <DIR>                       ..
22/09/2017  08:51                22              SCOOTE~1.TXT
               1 File(s)             22 bytes

     Total Files Listed:
               2 File(s)             43 bytes
               5 Dir(s)  104,170,942,464 bytes free

这里当前目录有一个文件,其长名Scooter - Cosmos.txt短名SCOOTE~1.TXT注意:在此阶段短名称​​已经到位)。此外,SFN 目录包含一个名为 SCOOTE~1.TXT 的文件——因为这个名称“适合”8.3 格式,所以它没有单独的短名称。

如果我们现在尝试将此文件复制到当前目录,因为正在复制的文件的短/唯一名称与已经存在的文件的短名称匹配,它会提示覆盖:

c:\Test> copy "SFN\SCOOTE~1.TXT"
Overwrite c:\Test\SCOOTE~1.TXT? (Yes/No/All): n
        0 file(s) copied.

单实例修复

正如eryksun 所建议的,您可以使用fsutil file setshortname 命令通过更改当前目录中文件的短名称 来修复一次性冲突:

c:\Test> fsutil file setshortname "Scooter - Cosmos.txt" SCOOTE~2.TXT

c:\Test> dir/x
 Volume in drive C is OS
 Volume Serial Number is BE3C-8BC1

 Directory of c:\Test

22/09/2017  09:09    <DIR>                       .
22/09/2017  09:09    <DIR>                       ..
22/09/2017  08:50                21 SCOOTE~2.TXT Scooter - Cosmos.txt
22/09/2017  08:51    <DIR>                       SFN
               1 File(s)             21 bytes
               3 Dir(s)  104,168,501,248 bytes free

c:\Test> copy "SFN\SCOOTE~1.TXT"
        1 file(s) copied.

c:\Test> dir/x
 Volume in drive C is OS
 Volume Serial Number is BE3C-8BC1

 Directory of c:\Test

22/09/2017  09:09    <DIR>                       .
22/09/2017  09:09    <DIR>                       ..
22/09/2017  08:50                21 SCOOTE~2.TXT Scooter - Cosmos.txt
22/09/2017  08:51                22              SCOOTE~1.TXT
22/09/2017  08:51    <DIR>                       SFN
               2 File(s)             43 bytes
               3 Dir(s)  104,168,464,384 bytes free

在这里我们可以看到Scooter - Cosmos.txt 的简称已更改,不再与SCOOTE~1.TXT 冲突;复制继续进行,没有警告,两个文件并排放置在当前目录中。

多实例修复

如果目标目录中的文件存在(或可能存在)多个冲突,另一种方法是使用fsutil 8dot3name strip 命令从所有文件中删除 8.3 格式的短名称文件一次:

c:\Test> fsutil 8dot3name strip .
Scanning registry...

Total affected registry keys:                   0

Stripping 8dot3 names...

Total files and directories scanned:            2
Total 8dot3 names found:                        1
Total 8dot3 names stripped:                     1

For details on the operations performed please see the log:
  "C:\Users\xxxxxxxx\AppData\Local\Temp\8dot3_removal_log @(GMT 2017-09-22 08-36-00).log"

c:\Test> dir/x
 Volume in drive C is OS
 Volume Serial Number is BE3C-8BC1

 Directory of c:\Test

22/09/2017  09:36    <DIR>                       .
22/09/2017  09:36    <DIR>                       ..
22/09/2017  08:50                21              Scooter - Cosmos.txt
22/09/2017  09:33    <DIR>                       SFN
               1 File(s)             21 bytes
               3 Dir(s)  104,154,349,568 bytes free

可以看出,文件Scooter - Cosmos.txt不再有短名,所以SCOOTE~1.TXT复制到当前目录时没有冲突:

c:\Test> copy "SFN\SCOOTE~1.TXT"
        1 file(s) copied.

c:\Test> dir/x
 Volume in drive C is OS
 Volume Serial Number is BE3C-8BC1

 Directory of c:\Test

22/09/2017  09:40    <DIR>                       .
22/09/2017  09:40    <DIR>                       ..
22/09/2017  08:50                21              Scooter - Cosmos.txt
22/09/2017  08:51                22              SCOOTE~1.TXT
22/09/2017  09:33    <DIR>                       SFN
               2 File(s)             43 bytes
               3 Dir(s)  104,151,703,552 bytes free

注意:此命令的第一阶段 - Scanning registry... - 可能需要一些时间,因为它正在通过注册表查找对即将删除的 8.3 格式名称的引用。有关此命令的更多详细信息,请参阅fsutil 8dot3name strip /?

注意(两种方法都适用

正如fsutil 8dot3name strip /? 命令的帮助所说:

此命令从您的卷中永久删除 8dot3 文件名。它 将列出指向剥离的 8dot3names 的注册表项,但 不会修改受影响的注册表项。剥离不会 对完整路径名长于最大路径的文件执行 长度为 260 个字符。

这两个命令都修改(或删除)所选文件的 8.3 格式名称。如果您对相关文件有任何引用(在注册表、配置文件或.BAT 文件等的其他位置),那么这些引用将不再有效。 谨慎使用任一解决方案

【讨论】:

    猜你喜欢
    • 2012-04-30
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多