Windowsで.shファイルをダブルクリックしてCygwinで長いrsyncコマンドを実行したいのですが。相対パスが機能するように、ファイルが含まれているディレクトリ(/ cygdrive/c/scripts /など)から開始する必要があります。誰かがこれを機能させましたか?
注:Windowsのコンテキストメニューを管理するCygwinパッケージ(Bash Prompt Here) here を見つけました。いくつかの手掛かりがあるかもしれません。
わかりました。うまくいくものを見つけました。 Vladimirが提案したようにバッチファイルを関連付けることは機能しませんでしたが、bash引数が重要でした。
短くて甘い:このコマンドに関連付けます:"C:\ cygwin\bin\bash.exe" -li "%1"%*
方法がわからない場合のロングバージョン:
[〜#〜] sh [〜#〜]を[〜#〜] pathext [〜#〜]環境変数に追加することもできます:
WinKey + Pause/Advanced /環境変数/システム変数/ PATHEXT
皆さん、助けてくれてありがとう!
これが私の解決策です。ディレクトリ階層のどこにあるかに関係なく、私の* .shスクリプトでうまく機能します。 cygpathでbashを呼び出す前に、cygpath dirnameにcdしていることに注意してください。うまくいきます。
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"を使用する必要がなくなるため、これを最良のソリューションと見なしています。
次に、.shおよび.bashファイルのドラッグ&ドロップサポートなどの追加機能が必要でした。少し掘り下げた後、.shファイルと.bashファイルを「bashscript」として関連付け、それらのWindowsエクスプローラーのドラッグ&ドロップハンドラーをアクティブにする.batを作成しました。 Dragosのコマンドを編集して、1つの引数(シェルスクリプトにドロップされたアイテムへのパス)を処理する必要がありました。
.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
Cygwinルートの「argshandler.sh」スクリプトは、最初に受け取った引数をcygpathだけ戻し、何もない場合(スクリプトファイルをダブルクリックする場合など)は何もしません。
#!/bin/bash
if [ ! "$1" == "" ]
then
cygpath -u "$1"
fi
これまでのところ、これらはすべてうまく機能しています。ただし、解決すべきニースとなるいくつかの欠点がまだあります。
どういうわけか、1ドロップされたアイテムのみの問題に関して、引数ハンドラースクリプトを変更して次のようなものを返す
"cygpathed-arg1" "cygpathed-arg2" "cygpathed-arg3"
ドラゴのコマンドのセッターを次のように変更します
...; bash "$(cygpath -u "%%1")" $(/argshandler.sh "%%2" "%%3" ... "%%9")'
(argshandler.shパーツの周りの ""がなくなっていることに注意してください)が正しく機能していないようです:スクリプトにドラッグされたアイテムの一部にパスに空白が含まれている場合、パスは空白で複数の引数に分割されますそれらのそれぞれが二重引用符で囲まれていても...奇妙です。
これらの問題の1つまたは両方を解決することに慣れているコマンドラインの専門家はいますか?
これは私が使用しているコマンドです:
"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で実行され、最大化され、実行されているスクリプト(ウィンドウへのパス)にウィンドウタイトルを設定し、スクリプトがある場所にディレクトリを変更し、スクリプトを実行し、完了後も開いたままになります。
または、これにより、タイトルがスクリプトの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 bashシェルを起動するcygwin.batバッチファイルから始めて、次のように変更しました。
$ cat test.bat
@echo off
set MYDIR=C:\scripts
C:\cygwin\bin\bash --login -c "cd $MYDIR && echo 'Now in' `pwd`; sleep 15"
これはおもちゃのスクリプトですが、rsyncを呼び出すか、別のシェルスクリプトを呼び出すように変更することができます。 MYDIRがハードコードされていなかった方がいいでしょう。それを自動的に設定する方法がprobabyにあります。
そうそう、Cygwinのbashシェルで.batファイルを作成したとき、ダブルクリックで起動する前に、「chmod + x test.bat」を実際に実行する必要があることに気付きました。 NTFSアクセス許可を設定していると思います。メモ帳だけを使用している場合は、その必要はありません。
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の[プログラムから開く...]ダイアログから、次のレジストリ値を編集します
[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\" %*"
.shファイルを\ CYGWIN\usr\bin\bash.exeに関連付けることができるはずです。スクリプトは独自の作業ディレクトリを変更する必要があります。私はこのようなものを上部に貼り付けることをお勧めします。
cd `dirname "$0"`
私はPuttyCyg(Cygwinウィンドウの素晴らしいPuTTY)を使用しています。
バッチスクリプトを作成します。私のマシンでは
C:\Dev\scripts\cygbashrun.bat
内容付き
SET CYGWIN=nodosfilewarning
C:\Cygwin\bin\PuTTY.exe -cygterm /bin/bash.exe %1
明らかに、PuttyCygのインストールのパスを含むように調整します。
次に、Windowsファイルエクスプローラーで、[ツール]-[フォルダーオプション]-[ファイルの種類]に移動します。
「.sh」エントリがない場合は作成します(または、スクリプトの内容に応じて.bashを作成します)。次に、詳細設定を行います。
[オプションの手順]アイコンを変更し、インストールからCygwinアイコンを選択します
次に:
私にとっては魅力のように機能します:O)
Dosボックスでassocおよびftypeコマンドを確認します。これが私のマシンの.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"
ftype
コマンドでパスをbashに変更し、cygwin
がインストールされている場所と一致するようにしてください。
機能する1つの解決策は、.bat
cygwinを開いてスクリプトを実行するファイル。
スクリプトを実行するスクリプトgo.sh
ホームディレクトリにあります:
@echo off
C:
chdir C:\cygwin\bin
bash --login -i ./go.sh
次のように、自分で.batスクリプトを開発し(他の回答に由来するものではなく)、この.batで開くファイルタイプ(* .cygwinなど)を関連付けました。
===ファイルrun-script-with-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
_
===ファイルrun-script-with-Cygwin-in-same-dir.bat ===
使用される構文の詳細な説明(興味がある場合):
for %%a in (%p%) do set p=%%~a
を使用します"%~1"
_を使用する必要があります。これにより、エスケープ文字として扱われる場合、フォルダー区切り文字「\」(%1内)がbashによって削除されません。それ以外の場合は、パスにスペースがないファイルをこの.batにドラッグしても機能しません。楽しんでいます:)
私は気にしませんでした。私は.shファイルをCrimson Editorに関連付けました(実際に実行するのと同じくらい多くの時間をかけてバグを解決するためです)。ファイルの種類>詳細設定で適切に「開く/編集」の組み合わせを機能させることが問題になりました。 Crimson Editorが使用するDDEコードを知っていれば、物事が簡単になります。しかし、この投稿の時点では、私はそれを見つけることができませんでした。
これは、初歩的なAppleScriptのスクリプト機能以上のものを求めてアプリケーションをスキャンしていたMac時代(1993-2008)を思い出させます。
BZT