"No such file or directory" - 但它确实存在 - Windows 7

"No such file or directory" - but it does exist - Windows 7

我正在通过批处理脚本(我只能通过 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

卧槽?我以前用过这个命令很多批量更新。

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

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

我得到:

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

我在这里错过了什么?

这是因为通配符文件名在 Unix 和 Windows 上的处理方式不同。

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

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

因为 rm 最初是一个 Unix 程序,它被编写为期望 shell 会处理通配符。 rm 不是为了在内部执行通配符扩展而编写的。当它作为 rm c:\HALS 2000\win7\*.* 在 Windows 上被调用并传递给未扩展的参数 c:\HALS 2000\win7\*.* 时,它会尝试删除一个文件,其名称完全是 c:\HALS 2000\win7\*.*。不存在这样的文件,因此删除尝试失败并且 rm 报告错误。

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