Подтвердить что ты не робот

Как выполнить bat файл из cygwin bash, который использует команду поиска Windows

Команда find полностью отличается в Windows и Unix. В Windows это fgrep -подобная утилита, отображающая совпадающие строки в файле; на Unix - и на Cygwin - он перечисляет имена файлов, соответствующие некоторым критериям.

Cygwin bash добавляет свои стандартные каталоги к текущему пути, поэтому внутри bash $PATH обычно /bin:/usr/bin:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS.

Начать обновление, чтобы предоставить дополнительную информацию

Например, у меня есть много скриптов, которые используют команду gnu find - например, скрипты для очистки деревьев каталогов, которые не содержат файлов:

purge-empty-dirs.sh
find . -depth -type d -empty | xargs rmdir -p

У меня также есть файл bat, чтобы начать сборку, в которой используется команда find find, которая ищет строки, соответствующие строке (аналогично gnu grep).

build.bat
...
dir | find "target"
if errorlevel = 1 goto no_target_dir
...

Теперь для работы bash script мне нужно /bin находиться в пути до c:\windows\system32. Но для запуска моего bat файла мне нужно c:\windows\system32 находиться в пути до /bin

В общем случае мы можем утверждать, что все файлы bat должны выполняться с исходным окружением, унаследованным bash, а не измененным. Это имеет смысл?

Окончательное обновление

Это как должно быть, но разбивает файлы bat, выполненные из bash. Каков наилучший способ решить эту проблему?

Есть ли способ заставить Cygwin выполнять файлы bat (или даже все исполняемые файлы Windows) с средой, с которой она начиналась? Я думаю о start /i поведении cmd.exe. Я подумываю написать свою собственную утилиту cygstart, которая делает это, сохраняя среду (или, по крайней мере, $PATH) в .bash_profile/.bashrc. Имеет ли это смысл?

Любые другие предложения?

Изменить: см. также Запустить новую среду cmd.exe и НЕ наследовать

4b9b3361

Ответ 2

Я протестировал решение от здесь и прекрасно работает:

start "clean shell" /i "%windir%\explorer.exe" "\path\to\your\script.bat"

Пример

to-run.bat script:

echo %PATH%
echo "TODO: some commands"
cmd

cygwin bash script, run-me.sh:

#!/bin/bash -e
set -x

SCRIPT_WINPATH=`cygpath --windows --absolute "$1"`
EXPLORER_CYGPATH=`which explorer`
EXPLORER_WINPATH=`cygpath --windows --absolute "${EXPLORER_CYGPATH}"`

cmd /C start "clean shell" /I "${EXPLORER_WINPATH}" "${SCRIPT_WINPATH}"

Тест:

chmod +x to-run.bat
chmod +x run-me.sh
./run-me.sh to-run.bat

Ответ 3

Вы можете использовать обертку, скажем, launcher.bat, содержимое которой

@echo off
setlocal
rem modify here based on your needs
set PATH=%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem
call %*
endlocal
exit %errorlevel%

Предположим, что вы вызываете cmdFUBAR.bat с помощью arg wellDoneMS из cygwin bash script, а не просто cmdFUBAR.bat wellDoneMS, вы делаете cygstart -w launcher.bat cmdFUBAR.bar wellDoneMS. Конечно, вы должны положить launcher.bat в свой путь или вызвать его с полным путем.

Ответ 4

=== В файле build.bat script...

SET DOS_FIND_EXE=%SYSTEMROOT%\system32\find.exe
...
dir | "%DOS_FIND_EXE%" "target"
if errorlevel = 1 goto no_target_dir
...

Ответ 5

Ответ, данный @ruslo, очень полезен и работает отлично, но там избыточность: start "clean shell" /I ничего не делает здесь:-) Это часть explorer, которая избавляется от текущей cygwin env, не start /i! Попробуйте исключить его из последней строки script, например:

cmd /C "${EXPLORER_WINPATH}" "${SCRIPT_WINPATH}"

Тот же результат - "первозданный путь"!

Просматривая справку для start, она говорит: Новая среда будет исходной средой, переданной cmd.exe, а не текущей средой. Ну, но среда, переданная в cmd, в этом случае имеет значение cygwin, поэтому start /i здесь ничего не будет полезен, как можно видеть, набрав:

cmd /c start /i cmd /c "path && pause"

Путь по-прежнему относится к cygwin, а не к системе Windows!