«Нет такого файла или каталога» - но он существует - Windows 7 - PullRequest
0 голосов
/ 25 января 2019

Я обновляю некоторые старые ПК с Windows 7 (они будут обновлены до Windows 10 к концу года) с помощью пакетного скрипта (у меня есть доступ только через SSH), и я столкнулся с проблемой, которой у меня не было раньше - в На самом деле такие команды раньше работали нормально, но внезапно - нет. Это блокирует меня.

Я нахожусь в этом каталоге (поэтому я знаю, что он существует):

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? Я использовал эту команду во многих пакетных обновлениях раньше.

Итак, я протестировал эту команду, когда удаленно вошел в систему на одном из ПК:

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

И я получаю:

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

Что мне здесь не хватает?

1 Ответ

0 голосов
/ 27 января 2019

Это происходит потому, что имена файлов с подстановочными символами обрабатываются по-разному в Unix и Windows.

В Unix аргументы с подстановочными знаками (аргументы, содержащие * и ?) раскрываются оболочкой (обработчик командной строки), а результаты расширения заменяются на подстановочный знак в списке передаваемых аргументов к программе. Если бы вы запустили эту команду rm в системе Unix, то полученные аргументы rm были бы списком имен upgrade.8.54.zip, upgrade.8.60.zip и upgrade.8.61.zip. rm затем по очереди принимает каждый аргумент и пытается его удалить.

В Windows аргументы с подстановочными символами не раскрываются обработчиком командной строки. Подстановочный знак передается без изменения в качестве аргумента в программу, и программа сама должна найти имена файлов, соответствующие подстановочному знаку.

Поскольку rm изначально является Unix-программой, написано, что она будет работать с подстановочными знаками. rm не написано для внутреннего расширения подстановочных знаков. Когда он вызывается в Windows как rm c:\HALS 2000\win7\*.* и ему передается нерасширенный аргумент c:\HALS 2000\win7\*.*, он пытается удалить файл, имя которого точно, буквально, c:\HALS 2000\win7\*.*. Такой файл не существует, поэтому попытка удаления не удалась, и rm сообщает об ошибке.

del - команда Windows, поэтому она была написана с расчетом на то, что ее могут попросить обработать расширение подстановочных аргументов. Когда ему дается аргумент c:\HALS 2000\win7\*.*, он находит файлы, имена которых соответствуют этому шаблону, и удаляет их.

...