سؤال

أرغب في تشغيل أمر rsync طويل في Cygwin بالنقر المزدوج على ملف .sh في Windows.يجب أن يبدأ في الدليل الذي يحتوي على الملف (على سبيل المثال./cygdrive/c/scripts/) حتى تعمل المسارات النسبية.هل حصل أي شخص على هذا العمل؟

ملحوظة:لقد وجدت للتو هنا, ، حزمة Cygwin التي تدير قوائم سياق Windows (Bash Prompt Here).قد يكون لديها بعض القرائن.

هل كانت مفيدة؟

المحلول

حسنًا، لقد وجدت شيئًا يعمل.لم ينجح ربط ملف دفعي كما اقترح فلاديمير، لكن وسيطات bash كانت أساسية.

قصيرة وحلوة:ربط مع هذا الأمر: "C:\cygwin\bin\bash.exe" -li "%1" %*

نسخة طويلة إذا كنت لا تعرف كيف:

  1. في Explorer، انتقل إلى "الأدوات/خيارات المجلد/أنواع الملفات".
  2. لقد كان لدي بالفعل إدخال SH لـ Bash Script.إذا لم يكن لديك واحد، فانقر فوق "جديد" وأدخل "SH" لإنشاء واحد.
  3. مع تحديد ملحق SH، انقر فوق خيارات متقدمة.
  4. اختر الإجراء "فتح" وانقر فوق "تحرير" (أو قم بإنشاء الإجراء).
  5. هذا هو الأمر الذي يجب استخدامه: "C:\cygwin\bin\bash.exe" -li "%1" %*.لاحظ أنه بدون -لي, ، كان يُعيد رسالة "لم يتم العثور على الأمر" في البرامج النصية الخاصة بي.

قد ترغب أيضًا في الإضافة ش لك باثيكست متغيرات البيئة:

WinKey + Pause / متقدم / متغيرات البيئة / متغيرات النظام / PATHEXT

شكرا لشباب مساعدتكم!

نصائح أخرى

هنا هو الحل الخاص بي.إنه يعمل بشكل جيد مع البرامج النصية الخاصة بي *.لاحظ أنني قرص مضغوط إلى cygpath dirname قبل الاتصال باش على cygpath.إنه يعمل فقط.

assoc .sh=bashscript

ftype bashscript=C:\cygwin\bin\bash.exe --login -i -c 'cd "$(dirname "$(cygpath -u "%1")")"; bash "$(cygpath -u "%1")"'

لقد كنت أعمل مع حل Dragos منذ بعض الوقت وأعتبره الأفضل لأنه يلغي الحاجة إلى استخدام "cygpath -u" داخل نصوص Shell الخاصة بك.

ثم أردت الحصول على ميزات إضافية مثل دعم السحب والإفلات لملفات .sh و.bash.بعد بعض البحث، قمت بكتابة ملف .bat الذي يربط ملفات .sh و.bash كـ "bashscript" ويقوم بتنشيط معالج السحب والإفلات في Windows Explorer لهم.اضطررت إلى تعديل أمر Dragos لجعله يتعامل مع وسيطة واحدة (تم إسقاط المسار إلى العنصر على برنامج نصي Shell).

يبدو ملف .bat تقريبًا كما يلي:

echo Registering .sh and .bash files as "bashscript"...
assoc .sh=bashscript
assoc .bash=bashscript
echo.
echo Setting the run command for the file type "bashscript"...
ftype bashscript=C:\cygwin\bin\bash.exe --login -i -c 'cd "$(dirname "$(cygpath -u "%%1")")"; bash "$(cygpath -u "%%1")" "$(/argshandler.sh "%%2")"'
echo.
echo Activating the drag^&drop capability for "bashscript" files (only 1 dropped item
echo will be passed to the script, multiple items are not supported yet)...
reg add HKEY_CLASSES_ROOT\bashscript\shellex\DropHandler /v "" /t REG_SZ /d "{60254CA5-953B-11CF-8C96-00AA00B8708C}" /f

يقوم البرنامج النصي "argshandler.sh" الموجود في جذر Cygwin فقط بإرجاع cygpath للوسيطة الأولى التي يتلقاها ولا شيء على الإطلاق إذا لم يكن هناك أي شيء (على سبيل المثال.إذا قمت بالنقر المزدوج على ملف البرنامج النصي):

#!/bin/bash
if [ ! "$1" == "" ]
then
    cygpath -u "$1"
fi

كل هذا يعمل بشكل جيد حتى الآن.ومع ذلك، لا تزال هناك بعض العيوب التي سيكون من الجيد حلها:

  • يفشل أمر Dragos ومشتقاته عندما يتعلق الأمر بالبرامج النصية الموجودة على مسارات UNC، على سبيل المثال.\\myserver\myshare\scriptfile.sh
  • سيتم تمرير عنصر واحد فقط تم إسقاطه إلى برنامج Shell النصي.

بطريقة ما، فيما يتعلق بمسألة إسقاط عنصر واحد فقط، تغيير البرنامج النصي لمعالج الوسيطة لإرجاع شيء مثل

"cygpathed-arg1" "cygpathed-arg2" "cygpathed-arg3"

وتغيير أداة ضبط أمر Dragos إلى شيء مثل

...; bash "$(cygpath -u "%%1")" $(/argshandler.sh "%%2" "%%3" ... "%%9")'

(لاحظ أن "" الموجود حول الجزء argshandler.sh قد اختفى) لا يبدو أنه يعمل بشكل صحيح:إذا كانت بعض العناصر التي تم سحبها إلى البرنامج النصي تحتوي على مسافة فارغة في مسارها، فسيتم تقسيم المسارات المذكورة إلى وسائط متعددة في الفراغات على الرغم من أن كل منها محاط بعلامات اقتباس مزدوجة ...غريب.

هل هناك أي متخصصين في سطر الأوامر يشعرون بالقدرة على حل إحدى هاتين المشكلتين أو كلتيهما؟

لا يؤدي هذا إلى ربط ملفات ‎.sh، ولكنه قد يمنحك ما تريد.لقد بدأت باستخدام الملف الدفعي cygwin.bat الذي يقوم بتشغيل Cygwin bash Shell، وقمت بتعديله على النحو التالي:

$ cat test.bat
@echo off

set MYDIR=C:\scripts

C:\cygwin\bin\bash --login -c "cd $MYDIR && echo 'Now in' `pwd`; sleep 15"

هذا عبارة عن برنامج نصي للعبة ولكن يمكنك تعديله للاتصال بـ rsync أو استدعاء برنامج نصي منفصل لـ Shell.أعترف أنه سيكون من الأفضل لو لم يكن به ترميز MYDIR الثابت.من المحتمل أن تكون هناك طريقة لجعله يضبط ذلك تلقائيًا.

أوه نعم، عندما قمت بإنشاء ملف .bat في bash Shell في Cygwin، لاحظت أنه يتعين علي استخدام "chmod +x test.bat" قبل أن أتمكن من تشغيله بنقرة مزدوجة.أعتقد أنه يقوم بتعيين أذونات NTFS.لن تحتاج إلى القيام بذلك إذا كنت تستخدم المفكرة للتو.

هذا هو الأمر الذي أستخدمه:

"C:\cygwin\bin\mintty.exe" -w max -h always -t "%1" -e /bin/bash -li -c 'cd "$(dirname "$(cygpath -u "%1")")" && bash "$(cygpath -u "%1")"'

يقوم بتشغيله بتنسيق Mintty، وتكبيره، وتعيين عنوان النافذة للبرنامج النصي الذي يتم تشغيله (مسار Windows إليه)، وتغيير الدليل إلى مكان وجود البرنامج النصي، وتشغيله ويظل مفتوحًا بعد اكتماله.

وبدلاً من ذلك، سيؤدي هذا إلى تعيين العنوان لمسار cygwin إلى البرنامج النصي:

"C:\cygwin\bin\mintty.exe" -w max -h always -t "%1" -e /bin/bash -li -c 'printf "\033]0;$(cygpath -u "%1")\007" && cd "$(dirname "$(cygpath -u "%1")")" && bash "$(cygpath -u "%1")"'

البرامج النصية المجمعة لتعيين الارتباط لك:

مسار Windows في العنوان:

@echo off
assoc .sh=shellscript
ftype shellscript="C:\cygwin\bin\mintty.exe" -w max -h always -t "%%1" -e /bin/bash -li -c 'cd "$(dirname "$(cygpath -u "%%1")")" ^&^& bash "$(cygpath -u "%%1")"'
pause

ومسار cygwin في العنوان:

@echo off
assoc .sh=shellscript
ftype shellscript="C:\cygwin\bin\mintty.exe" -w max -h always -t "%%1" -e /bin/bash -li -c 'printf "\033]0;$(cygpath -u "%%1")\007" ^&^& cd "$(dirname "$(cygpath -u "%%1")")" ^&^& bash "$(cygpath -u "%%1")"'
pause

يجب أن تكون قادرًا على ربط ملفات ‎.sh بـ \CYGWIN\usr\bin\bash.exe.سيتعين على البرنامج النصي تغيير دليل العمل الخاص به، وأقترح لصق شيء مثل هذا في الأعلى:

cd `dirname "$0"`
    Windows Registry Editor Version 5.00
    ;File:ConfigureShToBeRunUnderExplorer.reg v:1.0 docs at the end
    [HKEY_CLASSES_ROOT\Applications\bash.exe] 

    [HKEY_CLASSES_ROOT\Applications\bash.exe\shell]

    [HKEY_CLASSES_ROOT\Applications\bash.exe\shell\open]

    [HKEY_CLASSES_ROOT\Applications\bash.exe\shell\open\command]
    @="C:\\cygwin\\bin\\bash.exe -li \"%1\" %*"

    ; This is a simple registry file to automate the execution of sh via cygwin on windows 7, might work on other Windows versions ... not tested 
    ; you could add this setting by issueing the following command: reg import ConfigureShToBeRunUnderExplorer.reg 
    ; Note the path of your bash.exe
    ; Note that you still have to add the .sh to your %PATHTEXT%
            ; usage: double - click the file or reg import file 

بعد البحث في أماكن مختلفة.ما تمكنت من التوصل إليه هو الاختيار أولاً C:\cygwin64\bin\mintty.exe من حوار Windows "Open with ..." ثم قم بتحرير قيمة التسجيل

[Computer\HKEY_CLASSES_ROOT\Applications\mintty.exe\shell\open\command]

ل،

C:\cygwin64\bin\mintty.exe -t "%1" /bin/bash -l -i -c "v1=\"$(cygpath -u \"%0\" -a)\" && v2=\"$(dirname \"$v1\")\" && cd \"$v2\" ; exec bash  \"%1\" %*"  

أحد الحلول الناجحة هو إنشاء ملف .bat الملف الذي سيفتح cygwin وينفذ البرنامج النصي الخاص بك.

البرنامج النصي لتنفيذ البرنامج النصي go.sh الموجود في دليل منزلي:

@echo off

C:
chdir C:\cygwin\bin

bash --login -i ./go.sh

أنا فقط لم أزعجني.لقد قمت بربط ملفات .sh مع Crimson Editor (نظرًا لأنني أقضي الكثير من الوقت في حل الأخطاء كما أقضيها بالفعل في تشغيلها).يتعلق الأمر الآن بالحصول على المجموعة الصحيحة "فتح باستخدام/تحرير باستخدام" للعمل في أنواع الملفات> خيارات متقدمة.إذا كنت أعرف رمز DDE الذي يستخدمه Crimson Editor، فهذا من شأنه أن يجعل الأمور أسهل؛ومع ذلك، اعتبارًا من هذا المنشور، لم أتمكن من العثور عليه.

هذا يذكرني بأيام Mac (1993-2008) عندما كنت أحاول فحص التطبيقات بحثًا عن أكثر من إمكانية برمجة نصية AppleScript بدائية.

بزت

أستخدم PuttyCyg (معجون رائع في نافذة Cygwin) وإليك كيفية تنفيذ كل شيء:

إنشاء برنامج نصي دفعة، على سبيل المثال.على الجهاز الذي استخدمته

C:\Dev\scripts\cygbashrun.bat

مع المحتويات

SET CYGWIN=nodosfilewarning
C:\Cygwin\bin\putty.exe -cygterm /bin/bash.exe %1

من الواضح أنه يتكيف مع مسارات تثبيت PuttyCyg.

ثم في Windows File Explorer، انتقل إلى الأدوات - خيارات المجلد - أنواع الملفات

قم بإنشاء إدخال ".sh" إذا لم يكن موجودًا بالفعل (أو .bash اعتمادًا على ما تريد أن تحتوي عليه البرامج النصية الخاصة بك)..ثم متقدم..

[خطوة اختيارية] قم بتغيير الأيقونة وحدد أيقونة Cygwin من التثبيت الخاص بك

ثم:

  1. جديد..
  2. الإجراء = تشغيل باسكربت..
  3. التطبيق المستخدم لتنفيذ هذا الإجراء = C:\Dev\scripts\cygbashrun.bat "%1"

يعمل مثل السحر بالنسبة لي :O)

لقد قمت بتطوير برنامج نصي .bat بمفردي (لم ينشأ من إجابة الآخرين) لربط نوع الملف (على سبيل المثال.*.cygwin) ليتم فتحه باستخدام ملف .bat هذا، كما يلي:

=== ملف تشغيل البرنامج النصي مع Cygwin-in-same-dir.bat ===

@echo off
REM   Info: A script created by Johnny Wong.  (last modified on 2014-7-15)
REM   It is used to pass a file argument to run a bash script file.  The current directory is setting to the path of the script file for convenience.
REM   Could be copied to C:\cygwin;  and then you manually associate .cygwin file extension to open with this .bat file.
set CYGWIN=nodosfilewarning

C:\cygwin\bin\bash --login -i -c 'cd "`dirname "%~1"`"; exec bash "%~1" %2 %3 %4 %5 %6 %7 %8 %9'

REM finally pause the script (press any key to continue) to keep the window to see result
pause

=== ملف تشغيل البرنامج النصي مع Cygwin-in-same-dir.bat ===

شرح تفصيلي حول بناء الجملة المستخدم (إذا كنت مهتمًا):

  1. %1 يتم اقتباسه بـ "..." إذا كان مرتبطًا بملف لفتحه باستخدام .bat هذا.لسحب ملف إلى ملف .bat هذا، يتم اقتباس "..." فقط إذا كان مسار الملف يحتوي على مسافات.
  2. %~1 هو نفس %1 مع حذف علامات الاقتباس المزدوجة المحيطة، إذا كانت موجودة
  3. لإزالة علامات الاقتباس المزدوجة المحيطة من %p%، استخدم for %%a in (%p%) do set p=%%~a
  4. عليك أن تستعمل "%~1" لفرض علامات اقتباس مزدوجة على مسار ملف البرنامج النصي، بحيث لا تتم إزالة فواصل المجلدات '\' (في %1) بواسطة bash عند معاملتها كأحرف هروب.وإلا فإنه لا يعمل عند سحب ملف لا يحتوي على مسافات في مساره إلى هذا .bat.
  5. "exec bash" يمكن أن يكون مجرد "bash"، الأول مخصص لحفظ الموارد لعملية bash أخرى.

يتمتع :)

انظر إلى الأمرين assoc وftype في مربع dos.فيما يلي مثال لـ .jpg على جهازي

c:\>assoc .jpg
.jpg=jpegfile

c:\>ftype jpegfile
jpegfile="C:\Program Files\Common Files\Microsoft Shared\PhotoEd\PHOTOED.EXE" "%1"

assoc .sh=bashscript

ftype bashscript="c:\cygwin\bin\bash.exe" "%1"

تأكد من تغيير المسار إلى bash في ملف ftype الأمر لتتناسب مع المكان الذي لديك cygwin المثبتة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top