Пакет "%1" и пространства путей

В Windows я создал файл с именем mingw64_open_with.cmd и связанные с ним файлы .sh bash, чтобы они открывались вместе с ним, цель состоит в том, чтобы иметь возможность дважды щелкнуть сценарии .sh bash в Windows, чтобы запустить их через MinGW. Это мой скрипт .cmd:

@echo off
C:\msys\usr\bin\env.exe MSYSTEM=MINGW64 c:\msys\usr\bin\bash.exe -l -c "cd $(dirname "%1") && "%1""

Он работает отлично, если путь к скрипту .sh, который находится здесь %1, не содержит пробелов. Когда это произойдет, я получу это: c:\msys\usr\bin\bash: line 1: cd: too many arguments. Ничто из того, что я пробовал, например удвоение ", не решило проблему, я не знаю, что делать.

У меня не установлен Mingw64, поэтому я не могу это проверить, но поскольку пакетная обработка сначала обрабатывает эту строку, она читает "cd $(dirname " в качестве аргумента, затем %1, затем ") && ", затем %1, затем "". Поскольку пакет не может обрабатывать вложенные двойные кавычки, как это делает bash, вам придется сначала экранировать внутренние кавычки с помощью ^. Попробуйте -c "cd $(dirname ^"%1^") && ^"%1^"" и посмотрите, сработает ли это. Возможно, вам придется использовать ^^ вместо ^.

SomethingDark 22.07.2024 14:57

Для вашей конкретной задачи вам может помочь простая замена %1 на %*.

Compo 22.07.2024 15:04

Попробуйте cd "$(dirname "%1")".

Renaud Pacalet 22.07.2024 15:06

@SomethingDark с одним ^ я все равно получаю cd: too many arguments, а с ^^ я получаю bash: -c: line 2: unexpected EOF while looking for matching )'` @Compo Нет, я все равно получаю ` cd: слишком много аргументов` @RenaudPacalet Думаю, вы предлагаете удалить пару ", но тогда Я не смог выполнить остальную часть команды.

Michel Rouzic 22.07.2024 15:24

Можете ли вы ответить на вопрос, который еще никто не задавал? Если вы хотите запустить двойной щелчок по bash-скрипту mingw64_open_with.cmd, вам нужно точно указать команду, которая запускается при этом, и метод реализации. Нам необходимо иметь возможность воспроизвести вашу среду и результат, чтобы предложить целенаправленную помощь.

Compo 22.07.2024 15:33

@Compo, это обычная вещь для Windows, когда вы связываете тип файла с .cmd или .exe с помощью «Открыть с помощью...», путь к открываемому файлу — %1. Например, если мой файл .cmd содержит echo %1, он будет напечатан "D:\Virtual Machines\QEMU\QEMU machines\launch_vm.sh", когда я дважды щелкну этот файл. Обновлено: проблема решена, см. ответ ниже, спасибо всем за ваши усилия.

Michel Rouzic 22.07.2024 15:51

Вы не ответили на мой вопрос. Если вы создали ассоциацию файлов для файла .sh, то при этом вы должны ввести команду для запуска такой ассоциации. Если бы вместо этого вы создали запись типа контекстного меню (что, по моему мнению, было бы лучше), тогда вы бы создали команду, которая будет запускаться при вызове. Нам нужна эта команда, чтобы полностью соответствовать вашей среде и предложить вам наиболее надежное решение. В настоящее время, даже несмотря на опубликованный и принятый ответ, наши читатели могут только догадываться, как вызвать командный файл (который для этого даже не требуется), так же, как и вы.

Compo 22.07.2024 18:16

@Compo Я не знаю, о чем вы говорите, в Windows «Открыть с помощью...» работает не так. Файлы .sh теперь связаны с моим сценарием .cmd, вот и все.

Michel Rouzic 23.07.2024 21:16

Есть командная запись, не возмутительно спросить, что это за запись и как вы ее создали. Кроме того, зачем связывать каждый файл .sh с одним пакетным файлом? А как насчет создания записи контекстного меню с C:\msys\usr\bin\env.exe в качестве исполняемого файла и добавлением к нему ваших параметров и аргументов?

Compo 23.07.2024 23:34
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
82
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это работает для меня:

C:\msys\usr\bin\env.exe MSYSTEM=MINGW64 c:\msys\usr\bin\bash.exe -l -c "cd \"$(dirname \"$1\")\"; \"$1\"" sh %1

Я подтверждаю, что это работает и для меня, спасибо!

Michel Rouzic 22.07.2024 15:52

Другие вопросы по теме