У меня есть пакетный скрипт Windows, который использует Windows Ubuntu Bash. Он получает полный путь Windows в качестве аргумента, а затем передает этот путь команде в Ubuntu Bash.
@echo off
bash -lic 'ffmpeg -i "%1" output.avi'
Вот "%1"
полный путь Windows, как"C:\some path\file.avi"
Команда выдает ошибку:
C:some pathfile.avi: Protocol not found
Что я могу сделать, чтобы преобразовать этот путь Windows в путь, подобный тому, /mnt/c/some\ path/file.avi
который на самом деле понимает Windows Bash?
windows-subsystem-for-linux
laggingreflex
источник
источник
C:
с/mnt/c
(потенциально для других букв, тоже), не так ли?Ответы:
Windows Build 17046 [1] содержит новую
wslpath
утилиту, которая может переводить пути из / в WSL / Windows. Это было известно отсутствующей функцией WSL. [2]Пример использования:
Вы можете позвонить
wslpath
из Powershell в Windows:wslpath
варианты и параметры:источник
$ wslpath -a 'C:\\aaa\\bbb\\ccc\\foo.zip'
должен быть:$ wslpath -a 'C:\aaa\bbb\ccc\foo.zip'
Он работает, когда сбежал, но бесполезный выход сбивает с толку. Можно предположить, что это нужно избежать. Кроме того , я думаю , что описание на-m
,... with ‘/’ instead of ‘\\’
должны иметь один «\» (я знаю , что это копия-вставили) Если вы делаетеwslpath -w /mnt/c/Users
, это не печатает два «\\»wslpath
это часть ответа, но я считаю, что этот пост не дает функционального ответа на вопрос - который спрашивает, когда пакетный файл имеет имя в стиле Windows (C:\foo\bar\blah
) для файла данных, как он запускает команду WSL на этот файл?cat `wslpath '
затем перетащите и отпустите'`
Я написал файл летучей мыши, чтобы сделать это. Просто поместите файл, где бы вы ни работали, или добавьте его к своему пути (или просто поместите его над вашим кодом, с которым было бы легче работать). Не забудьте сначала назначить «переменную» для вашего пути к файлу (если вы используете отдельный файл, попробуйте использовать параметры).
Что делает код:
1) Получить первую букву пути, который является диск.
2) Удалите первые две буквы.
3) Поменяйте косую черту.
4) Это сложная часть: поскольку Linux чувствителен к регистру, нам нужно преобразовать букву диска в верхний регистр в строчный. Сделайте это путем сопоставления каждого (скажите, есть ли лучший способ). Вы также можете удалить ненужные буквы дисков, так как у вас, вероятно, не более десяти дисков.
5) Объедините все, чтобы получить финальную строку.
Результат:
Входные данные:
Вывод (с кавычками):
Код выглядит следующим образом:
источник
Почему так сложно?
Изменить запись реестра
из
в
Используйте обратные пометки перед wslpath и в конце и используйте одинарные кавычки (прямые тики) около% 1.
Работает для меня.
источник
bash
вызывается из командного файла? (Обратите внимание, что в данном примере первый аргумент bash таков-lic
, что мне непонятно, какwslpath '%1'
это будет работать.) И почему вы перешли с двойных кавычек ("%1"
) на одинарные кавычки ('%1'
)?