Windowsで.shファイルをダブルクリックして、Cygwinで長いrsyncコマンドを実行したいと思います。相対パスが機能するように、ファイルを含むディレクトリ(/ cygdrive / c / scripts /など)で開始する必要があります。誰かがこれを機能させましたか?
注:ここで、Windowsコンテキストメニューを管理するCygwinパッケージ(Bash Prompt Here)を見つけました。それはいくつかの手がかりを持っているかもしれません。
わかりました、私はうまくいくものを見つけました。ウラジミールが提案したようにバッチファイルを関連付けてもうまくいきませんでしたが、bash引数が重要でした.
簡潔でわかりやすい:次のコマンドに関連付けます: "C:\cygwin\bin\bash.exe" -li "%1" %*
方法がわからない場合のロングバージョン:
SHをPATHEXT環境変数に追加することもできます。
WinKey+Pause / Advanced / 環境変数 / システム変数 / PATHEXT
助けてくれてありがとう、みんな!
Here is my solution. It works well for my *.sh scripts regardless of where they are in the directory hierarchy. Notice that I cd to the cygpath dirname before calling bash on the cygpath. It just works.
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" スクリプトは、受け取った最初の引数を cygpaths に戻すだけで、引数がない場合は何もしません (たとえば、スクリプト ファイルをダブルクリックした場合)。
#!/bin/bash
if [ ! "$1" == "" ]
then
cygpath -u "$1"
fi
これまでのところ、これはすべて非常にうまく機能しています。ただし、解決した方がよいいくつかの欠点がまだあります。
どういうわけか、1-dropped-item-onlyの問題に関して、引数ハンドラースクリプトを変更して、次のようなものを返すようにします
"cygpathed-arg1" "cygpathed-arg2" "cygpathed-arg3"
ドラゴスのコマンドのセッターを次のように変更します
...; bash "$(cygpath -u "%%1")" $(/argshandler.sh "%%2" "%%3" ... "%%9")'
(argshandler.sh 部分の周りの "" がなくなっていることに注意してください) 正しく動作していないようです: スクリプトにドラッグされたアイテムの一部のパスに空白が含まれている場合、パスは空白で複数の引数に分割されます。それぞれが二重引用符で囲まれていますが...奇妙です。
これらの問題の 1 つまたは両方を解決することに自信を持っているコマンド ラインの専門家はいますか?
これは .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 がハードコードされていない方が良いことは認めます。おそらく、それを自動的に設定する方法があります。
そうそう、Cygwin の bash シェルで .bat ファイルを作成したとき、ダブルクリックで起動する前に実際に「chmod +x test.bat」を実行する必要があることに気付きました。NTFSアクセス許可を設定していると思います。メモ帳を使用しただけの場合は、その必要はありません。
いろいろなところを見て回った後。私が思いついたのは、最初C:\cygwin64\bin\mintty.exe
にウィンドウの「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\" %*"
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
私はPuttyCyg(Cygwinウィンドウで素晴らしいパテ)を使用しています。これをすべて実行する方法は次のとおりです。
バッチ スクリプトを作成します。私が使用した私のマシンで
C:\Dev\scripts\cygbashrun.bat
内容あり
SET CYGWIN=nodosfilewarning
C:\Cygwin\bin\putty.exe -cygterm /bin/bash.exe %1
明らかに、PuttyCyg のインストールのパスを含めるように適応します。
次に、Windows ファイル エクスプローラーで、[ツール] - [フォルダー オプション] - [ファイルの種類] に移動します。
まだ存在しない場合は「.sh」エントリを作成します(または、スクリプトに必要なものに応じて.bash)..次に、高度な..
[オプションの手順] アイコンを変更し、インストールから Cygwin アイコンを選択します
それで:
私にとって魅力のように機能します:O)
.sh ファイルを \CYGWIN\usr\bin\bash.exe に関連付けることができるはずです。スクリプトは独自の作業ディレクトリを変更する必要があります。上部に次のようなものを貼り付けることをお勧めします。
cd `dirname "$0"`
私は気にしませんでした。.shファイルをCrimsonEditorに関連付けました(実際に実行するのと同じくらい多くの時間をバグの解決に費やしているため)。今では、[ファイルの種類]> [詳細]で機能するように、適切な「開く/編集する」組み合わせを取得する必要があります。Crimson Editorが使用するDDEコードを知っていれば、作業が簡単になります。ただし、この投稿の時点では見つかりませんでした。
これは、私が基本的なAppleScriptのスクリプト可能性以上のものを求めてアプリケーションをスキャンしようとしていた、私のMac時代(1993-2008)を思い出させます。
BZT
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
.bat
有効な解決策の 1 つは、 cygwin を開いてスクリプトを実行するファイルを作成することです。
go.sh
ホームディレクトリにあるスクリプトを実行するスクリプト:
@echo off
C:
chdir C:\cygwin\bin
bash --login -i ./go.sh
次のように、ファイルタイプ(* .cygwinなど)をこの.batで開くように関連付けるために、(他の人の回答に由来するのではなく)独自に.batスクリプトを開発しました。
=== ファイル 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 にドラッグしても機能しません。楽しんでいます:)