“没有这样的文件或目录”-但确实存在-Windows 7

时间:2019-01-25 14:38:14

标签: command-line windows-7 rm

我正在通过批处理脚本(我只能通过SSH访问)更新一些旧的Windows 7 PC(它们将在今年年底之前升级到Windows 10),并且遇到了以前从未遇到过的问题-实际上,像这样的命令以前工作得很好,但突然之间却没有。这使我感到沮丧。

我在此目录中(所以我知道它存在):

C:\HALS 2000\win7>ls -l
total 2908
-rwx------+ 1 Administrators None  880877 Jan 21 08:17 upgrade.8.54.zip
-rwx------+ 1 Administrators None  934641 Jan 21 08:17 upgrade.8.60.zip
-rwx------+ 1 Administrators None 1153914 Jan 16 12:27 upgrade.8.61.zip

我使用以下命令:

if exist c:\"HALS 2000"\win7\*.* rm c:\"HALS 2000"\win7\*.*

但我明白了

rm: cannot remove 'c:\\HALS 2000\\win7\\*.*': No such file or directory

WTF?在此之前,我已经使用了很多批处理更新的命令。

所以我在远程登录其中一台PC时测试了此命令:

if exist \"HALS 2000"\win7\*.* rm \"HALS 2000"\win7\*.* 

我得到:

rm: cannot remove '\\HALS 2000win7*.*': No such file or directory

我在这里想念什么?

1 个答案:

答案 0 :(得分:1)

之所以发生这种情况,是因为在Unix和Windows上通配符的文件名处理方式不同。

在Unix中,通配符参数(包含*?的参数)被外壳程序(命令行处理程序)扩展,并且扩展的结果替换为列表中的通配符。传递给程序的参数。如果您在Unix系统上运行过rm命令,那么rm收到的参数将是名称upgrade.8.54.zip的列表, upgrade.8.60.zipupgrade.8.61.ziprm然后依次获取每个参数并尝试将其删除。

在Windows中,命令行处理程序不会扩展通配符。通配符未经修改地作为参数传递给程序,由程序本身来查找与通配符匹配的文件名。

由于rm最初是Unix程序,因此编写该程序时希望shell能处理通配符。 rm未被编写为在内部执行通配符扩展。在Windows上以rm c:\HALS 2000\win7\*.*调用它并传递未扩展的参数c:\HALS 2000\win7\*.*时,它将尝试删除名称实际上为c:\HALS 2000\win7\*.*的文件。没有此类文件,因此删除尝试失败,并且rm报告错误。

del是Windows命令,因此编写该命令时可能会要求它处理通配符参数的扩展。当给定参数c:\HALS 2000\win7\*.*时,它将查找名称与该通配符匹配的文件,并将其删除。