"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.zip
,
upgrade.8.60.zip
和 upgrade.8.61.zip
。 rm
然后依次获取每个参数并尝试删除它。
在 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\*.*
时,它会找到名称与该通配符匹配的文件并删除它们。
我正在通过批处理脚本(我只能通过 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.zip
,
upgrade.8.60.zip
和 upgrade.8.61.zip
。 rm
然后依次获取每个参数并尝试删除它。
在 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\*.*
时,它会找到名称与该通配符匹配的文件并删除它们。