it-swarm.asia

كيفية تنفيذ ملف bat من cygwin bash الذي يستخدم الأمر Windows find

الأمر find مختلف تمامًا في Windows و Unix. على Windows ، يشبه fgrep - أداة مساعدة تسرد أسطر المطابقة في ملف ؛ على يونكس - وعلى Cygwin - تسرد أسماء الملفات المطابقة لبعض المعايير.

Cygwin bash prepends دلائلها القياسية على المسار الحالي ، حتى داخل 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

لدي أيضًا ملف مضرب لبدء عملية الإنشاء الخاصة بي ، والذي يستخدم الأمر windows find ، والذي يبحث عن خطوط مطابقة لسلسلة (تشبه gnu grep).

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

الآن ، لكي يعمل برنامج bash النصي الخاص بي ، أحتاج /bin أن تكون في الطريق قبل c:\windows\system32. ولكن لكي يتم تشغيل ملف الخفافيش الخاص بي ، أحتاج c:\windows\system32 أن تكون في الطريق قبل /bin

بشكل عام ، قد نكون قادرين على الادعاء بأنه يجب تنفيذ جميع ملفات الخفافيش مع البيئة الأصلية الموروثة من bash ، وليس الملف المعدل . هل هذا منطقي؟

نهاية التحديث

هذا ما يجب أن يكون ، ولكن يكسر ملفات الخفافيش المنفذة من باش. ما هي أفضل طريقة لمعالجة هذا؟

هل هناك طريقة لإجبار Cygwin على تنفيذ ملفات الخفافيش (أو حتى كل شيء Windows التنفيذية) مع البيئة التي بدأ بها؟ أنا أفكر في start /i سلوك cmd.exe. أفكر في كتابتي cygstart مثل الأداة المساعدة التي تقوم بذلك ، عن طريق توفير البيئة (أو على الأقل $PATH) في .bash_profile/.bashrc. هل هذا منطقي؟

أي اقتراحات أخرى؟

تحرير: راجع أيضًا بدء تشغيل cmd.exe جديد وعدم وراثة البيئة

37
Miserable Variable

اذا أنت chmod +x your.bat إنها تعمل.

./your.bat

يتم تشغيله عبر cmd /c

أجاب بالفعل في لماذا هو أن Cygwin يمكن تشغيل البرامج النصية .bat؟

31
rurban

لقد اختبرت حلاً من هنا ويعمل بشكل جيد:

start "clean Shell" /i "%windir%\Explorer.exe" "\path\to\your\script.bat"

مثال

to-run.bat النصي:

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
5
user2288008

يمكنك استخدام غلاف ، على سبيل المثال ، 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 ، بدلاً من مجرد cmdFUBAR.bat wellDoneMS، أنت تفعل cygstart -w launcher.bat cmdFUBAR.bar wellDoneMS. بالطبع عليك أن تضع launcher.bat في المسار الخاص بك ، أو نسميها مع المسار الكامل.

2
Not an ID

الجواب الذي قدمهruslo مفيد للغاية ويعمل بشكل جيد ، ولكن هناك تكرار فيه: start "clean Shell" /I لا تفعل شيئًا هنا :-) إنها قطعة Explorer التي تتخلص من eng cygwin الحالي ، وليس start /i! حاول حذفها من السطر الأخير من البرنامج النصي ، مثل:

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

نفس النتيجة - "المسار البكر"!

من خلال المساعدة على start ، تقول: البيئة الجديدة ستكون البيئة الأصلية التي تم تمريرها إلى cmd.exe وليست البيئة الحالية. حسنًا ، ولكن البيئة انتقلت إلى cmd في هذه الحالة هو cygwin ، لذلك start /i لن تفعل شيئًا مفيدًا هنا ، كما يمكن للمرء أن يرى من خلال الكتابة:

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

لا يزال المسار هو cygwin ، وليس نظام النوافذ!

0
dobriai

=== في البرنامج النصي build.bat ...

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