49

Windowsで.shファイルをダブルクリックして、Cygwinで長いrsyncコマンドを実行したいと思います。相対パスが機能するように、ファイルを含むディレクトリ(/ cygdrive / c / scripts /など)で開始する必要があります。誰かがこれを機能させましたか?

注:ここで、Windowsコンテキストメニューを管理するCygwinパッケージ(Bash Prompt Here)を見つけました。それはいくつかの手がかりを持っているかもしれません。

4

13 に答える 13

42

わかりました、私はうまくいくものを見つけました。ウラジミールが提案したようにバッチファイルを関連付けてもうまくいきませんでしたが、bash引数が重要でした.

簡潔でわかりやすい:次のコマンドに関連付けます: "C:\cygwin\bin\bash.exe" -li "%1" %*

方法がわからない場合のロングバージョン:

  1. エクスプローラーで、[ツール]、[フォルダー オプション]、[ファイルの種類] の順に移動します。
  2. 私はすでに Bash Script の SH エントリを持っていました。持っていない場合は、[新規] をクリックし、「SH」と入力して作成します。
  3. SH 拡張機能を選択した状態で、[詳細設定] をクリックします。
  4. 「開く」アクションを選択し、編集をクリックします (またはアクションを作成します)。
  5. これは使用するコマンドです: "C:\cygwin\bin\bash.exe" -li "%1" %*-liがないと、スクリプトで「コマンドが見つかりません」が返されることに注意してください。

SHPATHEXT環境変数に追加することもできます。

WinKey+Pause / Advanced / 環境変数 / システム変数 / PATHEXT

助けてくれてありがとう、みんな!

于 2008-09-19T23:14:59.713 に答える
16

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")"'
于 2009-03-06T23:50:55.867 に答える
6

私はしばらくの間、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

これまでのところ、これはすべて非常にうまく機能しています。ただし、解決した方がよいいくつかの欠点がまだあります。

  • Dragos のコマンドとその派生コマンドは、\\myserver\myshare\scriptfile.sh などの UNC パスにあるスクリプトに関しては失敗します。
  • ドロップされたアイテムは 1 つだけシェル スクリプトに渡されます。

どういうわけか、1-dropped-item-onlyの問題に関して、引数ハンドラースクリプトを変更して、次のようなものを返すようにします

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

ドラゴスのコマンドのセッターを次のように変更します

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

(argshandler.sh 部分の周りの "" がなくなっていることに注意してください) 正しく動作していないようです: スクリプトにドラッグされたアイテムの一部のパスに空白が含まれている場合、パスは空白で複数の引数に分割されます。それぞれが二重引用符で囲まれていますが...奇妙です。

これらの問題の 1 つまたは両方を解決することに自信を持っているコマンド ラインの専門家はいますか?

于 2010-04-29T08:18:42.723 に答える
2

これは .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アクセス許可を設定していると思います。メモ帳を使用しただけの場合は、その必要はありません。

于 2008-09-19T20:36:46.877 に答える
2

いろいろなところを見て回った後。私が思いついたのは、最初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\" %*"  
于 2018-09-11T07:25:06.210 に答える
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 
于 2011-07-07T10:17:03.960 に答える
1

私は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 アイコンを選択します

それで:

  1. 新しい..
  2. アクション = Bashscript を実行..
  3. このアクションの実行に使用されたアプリケーション = C:\Dev\scripts\cygbashrun.bat "%1"

私にとって魅力のように機能します:O)

于 2010-03-04T10:41:56.430 に答える
1

.sh ファイルを \CYGWIN\usr\bin\bash.exe に関連付けることができるはずです。スクリプトは独自の作業ディレクトリを変更する必要があります。上部に次のようなものを貼り付けることをお勧めします。

cd `dirname "$0"`
于 2008-09-19T20:34:05.713 に答える
0

私は気にしませんでした。.shファイルをCrimsonEditorに関連付けました(実際に実行するのと同じくらい多くの時間をバグの解決に費やしているため)。今では、[ファイルの種類]> [詳細]で機能するように、適切な「開く/編集する」組み合わせを取得する必要があります。Crimson Editorが使用するDDEコードを知っていれば、作業が簡単になります。ただし、この投稿の時点では見つかりませんでした。

これは、私が基本的なAppleScriptのスクリプト可能性以上のものを求めてアプリケーションをスキャンしようとしていた、私のMac時代(1993-2008)を思い出させます。

BZT

于 2010-02-21T07:21:56.303 に答える
0

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

于 2008-09-19T22:13:26.863 に答える
0

.bat有効な解決策の 1 つは、 cygwin を開いてスクリプトを実行するファイルを作成することです。

go.shホームディレクトリにあるスクリプトを実行するスクリプト:

@echo off

C:
chdir C:\cygwin\bin

bash --login -i ./go.sh
于 2008-09-19T20:27:24.687 に答える
0

次のように、ファイルタイプ(* .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 ===

使用される構文の詳細な説明 (興味がある場合) :

  1. この .bat で開くファイルが関連付けられている場合、%1 は "..." で囲まれています。ファイルをこの .bat にドラッグする場合、ファイルのパスにスペースが含まれている場合にのみ "..." で囲みます。
  2. %~1 は、周囲の二重引用符が存在する場合は除去された %1 と同じです
  3. %p% から周囲の二重引用符を削除するには、次を使用しますfor %%a in (%p%) do set p=%%~a
  4. スクリプト ファイルのパスを強制的に二重引用符で囲むために使用する必要があります"%~1"。これにより、エスケープ文字として扱われるときに、そのフォルダー セパレーター '\' (%1 内) が bash によって削除されません。そうしないと、パスにスペースが含まれていないファイルをこの .bat にドラッグしても機能しません。
  5. 「exec bash」は単に「bash」にすることもできます。前者は、もう 1 つの bash プロセスのためにリソースを節約するためのものです。

楽しんでいます:)

于 2014-07-15T10:43:12.647 に答える