49

我想通过双击 Windows 中的 .sh 文件在 Cygwin 中运行长 rsync 命令。它必须从文件的包含目录(例如/cygdrive/c/scripts/)开始,以便相对路径起作用。有人让这个工作吗?

注意:我刚刚在这里找到了一个管理 Windows 上下文菜单的 Cygwin 包(Bash Prompt Here)。它可能有一些线索。

4

13 回答 13

42

好的,我发现了一些有用的东西。按照 Vladimir 的建议关联批处理文件不起作用,但 bash 参数是关键。

简短而甜蜜:与此命令相关联:“C:\cygwin\bin\bash.exe”-li“%1”%*

如果您不知道如何使用长版本:

  1. 在资源管理器中,转到工具/文件夹选项/文件类型。
  2. 我已经有一个 Bash 脚本的 SH 条目。如果您没有,请单击新建并输入“SH”创建一个。
  3. 选择 SH 扩展名后,单击高级。
  4. 选择“打开”操作并单击编辑(或创建操作)。
  5. 这是要使用的命令:"C:\cygwin\bin\bash.exe" -li "%1" %*。请注意,如果没有-li,它会在我的脚本中返回“找不到命令”。

您可能还想将SH添加到PATHEXT环境变量中:

WinKey+Pause / 高级 / 环境变量 / 系统变量 / PATHEXT

谢谢你们的帮助,伙计们!

于 2008-09-19T23:14:59.713 回答
16

这是我的解决方案。它适用于我的 *.sh 脚本,无论它们在目录层次结构中的什么位置。请注意,在 cygpath 上调用 bash 之前,我 cd 到了 cygpath 目录名。它只是工作。

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 的解决方案,我认为它是最好的解决方案,因为它消除了在 shell 脚本中使用“cygpath -u”的需要。

然后,我想拥有其他功能,例如对 .sh 和 .bash 文件的拖放支持。经过一番挖掘,我编写了一个 .bat,将 .sh 和 .bash 文件关联为“bashscript”,并为它们激活 Windows 资源管理器拖放处理程序。我必须编辑 Dragos 的命令以使其处理 1 个参数(放置在 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

Cygwin 根目录中的“argshandler.sh”脚本只是 cygpath 返回它接收到的第一个参数,如果没有任何参数则什么都没有(例如,如果你只是双击脚本文件):

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

到目前为止,所有这些都非常有效。但是,仍然有一些缺点需要解决:

  • 当涉及到位于 UNC 路径(例如 \\myserver\myshare\scriptfile.sh)上的脚本时,Dragos 的命令及其衍生命令会失败
  • 只有 1 个丢弃的项目将传递给 shell 脚本。

不知何故,关于 1-dropped-item-only 问题,更改参数处理程序脚本以返回类似

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

并将 Dragos 命令的设置器更改为类似

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

(请注意,argshandler.sh 部分周围的“”已消失)似乎无法正常工作:如果拖到脚本上的某些项目在其路径中包含空白,则所述路径将在空白处分解为多个参数即使它们中的每一个都用双引号引起来……很奇怪。

是否有任何命令行专业人员愿意解决这些问题中的一个或两个?

于 2010-04-29T08:18:42.723 回答
2

这不会关联 .sh 文件,但它可能会为您提供所需的内容。我从启动 Cygwin bash shell 的 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 或调用单独的 shell 脚本。我承认如果没有 MYDIR 硬编码会更好。可能有一种方法可以让它自动设置它。

哦,是的,当我在 Cygwin 的 bash shell 中创建 .bat 文件时,我注意到我实际上必须“chmod +x test.bat”才能通过双击启动它。我认为它正在设置 NTFS 权限。如果您只是使用记事本,则不需要这样做。

于 2008-09-19T20:36:46.877 回答
2

这是我正在使用的命令:

"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
于 2015-08-14T13:35:55.033 回答
2

在环顾了不同的地方之后。我设法想出的是,首先C:\cygwin64\bin\mintty.exe从窗口中选择“打开方式...”对话框然后编辑注册表值

[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

您应该能够将 .sh 文件与 \CYGWIN\usr\bin\bash.exe 相关联。该脚本将不得不更改自己的工作目录,我建议在顶部粘贴这样的内容:

cd `dirname "$0"`
于 2008-09-19T20:34:05.713 回答
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,具体取决于您希望脚本拥有的内容)......然后是 Advanced..

[可选步骤] 更改图标并从您的安装中选择 Cygwin 图标

然后:

  1. 新的..
  2. 行动 = 运行 Bashscript..
  3. 用于执行此操作的应用程序 = C:\Dev\scripts\cygbashrun.bat "%1"

对我来说就像一个魅力:O)

于 2010-03-04T10:41:56.430 回答
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 回答
0

一种可行的解决方案是创建一个.bat文件,该文件将打开 cygwin 并执行您的脚本。

go.sh执行位于我的主目录中的脚本的脚本:

@echo off

C:
chdir C:\cygwin\bin

bash --login -i ./go.sh
于 2008-09-19T20:27:24.687 回答
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"

确保在命令中更改 bash 的路径以ftype匹配您的cygwin安装位置

于 2008-09-19T22:13:26.863 回答
0

我只是没有打扰。我将 .sh 文件与 Crimson 编辑器相关联(因为我花费的时间与实际运行它们的时间一样多)。现在需要在文件类型>高级中获得正确的“打开方式/编辑方式”组合。如果我知道 Crimson Editor 使用的 DDE 代码,那会更容易;然而,截至这篇文章我还没有找到它。

这让我想起了我的 Mac 时代(1993-2008 年),那时我曾经尝试扫描应用程序以获得更多基本的 AppleScript 脚本能力。

BZT

于 2010-02-21T07:21:56.303 回答
0

我自己开发了一个 .bat 脚本(不是源自其他人的答案),以将要打开的文件类型(例如 *.cygwin)与此 .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”,前者是为了节省更多的 bash 进程的资源。

喜欢:)

于 2014-07-15T10:43:12.647 回答