我正在通过批处理脚本更新一些旧的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.zip
,upgrade.8.60.zip
和upgrade.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*.*
它会找到名称与该通配符匹配的文件并删除它们。