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



我正在通过批处理脚本更新一些旧的Windows 7 PC(它们将在年底前升级到Windows 10)(我只能通过SSH访问),并且遇到了我以前从未遇到过的问题 - 事实上,像这样的命令以前工作正常,但突然不行了。 这个让我很困惑。

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

C:HALS 2000win7>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.zip. 然后,rm依次获取每个参数并尝试将其删除。

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

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

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

最新更新