Windows命令行和批处理文件:文件名中未转义的特殊字符可能存在问题?

时间:2016-10-17 09:14:03

标签: windows batch-file cmd special-characters filenames

到目前为止,我认为windows不允许在命令行中有意义的所有特殊字符。但是,完全可以使用名为“file%sometext%”的文件

如果在批处理脚本或命令中调用此文件名,则空变量%sometext%将扩展为空,文件名解析为“file”。

是否有任何其他合法文件名可能以这种方式导致批处理脚本出现问题?

1 个答案:

答案 0 :(得分:2)

Windows NT是运行其他操作系统的操作系统。操作系统执行文件操作的规则是适用的规则。

这些是Windows'规则。 Unix程序将遵循Unix的规则。可以在Unix中创建一个无法在Windows中打开的文件,反之亦然。

  

文件名约定

     

尽管每个文件系统都可以具有关于目录或文件名中单个组件的形成的特定规则,但所有文件系统都遵循相同的一般约定:基本文件名和可选扩展名,以句点分隔。例如,MS-DOS FAT文件系统支持基本文件名的8个字符和扩展名的3个字符。这称为8.3文件名。 FAT文件系统和NTFS支持文件名,最长可达255个字符。这称为长文件名。要获得给定长文件名的MS-DOS文件名,请使用GetShortPathName函数。要获取文件的完整路径,请使用GetFullPathName函数。

     

两个文件系统在形成路径时都使用反斜杠(\)字符分隔目录名称和文件名。

     

为用户提供的目录和文件或处理名称创建名称的应用程序的一般规则包括:

     

使用当前代码页中的任何字符作为名称,但不要使用路径分隔符,0到31范围内的字符,或文件系统明确禁止的任何字符。名称可以包含扩展字符集中的字符(128-255)。

     

使用反斜杠(\),正斜杠(/)或两者来分隔路径中的组件。没有其他字符可以作为路径分隔符。请注意,UNC名称必须遵循以下格式:\\ server \ share。   使用句点(。)作为路径中的目录组件来表示当前目录。

     

使用两个连续句点(..)作为路径中的目录组件来表示当前目录的父目录。   使用句点(。)将基本文件名与目录名或文件名中的扩展名分开。

     

不要在目录名或文件名中使用以下字符,因为它们是保留的:

     

< > :" / \ |

     

请勿将设备名称(例如aux,con,lpt1和prn)用作文件名或目录名。

     

将路径处理为以null结尾的字符串。 MAX_PATH给出了路径的最大长度,包括尾部反斜杠。   如果路径具有" \\?\"多个函数的Unicode版本允许超过MAX_PATH长度的路径。字首。 " \\?\"告诉函数关闭路径解析。但是,路径中的每个组件长度不能超过MAX_PATH个字符。使用" \\?\"前缀与本地存储设备的路径和" \\?\ UNC \"带有通用命名约定(UNC)格式的路径的前缀。 " \\?\"被忽略作为路径的一部分。例如," \\?\ C:\ myworld \ private"被视为" C:\ myworld \ private"," \\?\ UNC \ bill_g_1 \ hotstuff \ coolapps"被视为" \\ bill_g_1 \ hotstuff \ coolapps"。

     

不要假设区分大小写。考虑OSCAR,Oscar和oscar等名称是相同的。

     

以下保留字不能用作文件名:CON,PRN,AUX,CLOCK $,NUL,COM1,COM2,COM3,COM4,COM5,COM6,COM7,COM8,COM9,LPT1,LPT2, LPT3,LPT4,LPT5,LPT6,LPT7,LPT8和LPT9。此外,保留字后跟扩展名(例如NUL.tx7)是无效的文件名。

     

通过遵循本节中列出的规则,应用程序可以为文件和目录创建有效名称,而不管正在使用的文件系统如何。

     

反斜杠(\)用作路径中的元素分隔符(将文件名与路径分隔,或路径中的目录彼此分开)。您不能在文件或目录名称中使用它们。它们可能是卷名称的一部分(例如," C:\")。

     

平台SDK发布:2001年8月