我想通过双击 Windows 中的 .sh 文件在 Cygwin 中运行长 rsync 命令。它必须从文件的包含目录(例如/cygdrive/c/scripts/)开始,以便相对路径起作用。有人让这个工作吗?
注意:我刚刚在这里找到了一个管理 Windows 上下文菜单的 Cygwin 包(Bash Prompt Here)。它可能有一些线索。
好的,我发现了一些有用的东西。按照 Vladimir 的建议关联批处理文件不起作用,但 bash 参数是关键。
简短而甜蜜:与此命令相关联:“C:\cygwin\bin\bash.exe”-li“%1”%*
如果您不知道如何使用长版本:
您可能还想将SH添加到PATHEXT环境变量中:
WinKey+Pause / 高级 / 环境变量 / 系统变量 / PATHEXT
谢谢你们的帮助,伙计们!
这是我的解决方案。它适用于我的 *.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")"'
一段时间以来,我一直在使用 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
到目前为止,所有这些都非常有效。但是,仍然有一些缺点需要解决:
不知何故,关于 1-dropped-item-only 问题,更改参数处理程序脚本以返回类似
"cygpathed-arg1" "cygpathed-arg2" "cygpathed-arg3"
并将 Dragos 命令的设置器更改为类似
...; bash "$(cygpath -u "%%1")" $(/argshandler.sh "%%2" "%%3" ... "%%9")'
(请注意,argshandler.sh 部分周围的“”已消失)似乎无法正常工作:如果拖到脚本上的某些项目在其路径中包含空白,则所述路径将在空白处分解为多个参数即使它们中的每一个都用双引号引起来……很奇怪。
是否有任何命令行专业人员愿意解决这些问题中的一个或两个?
这不会关联 .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 权限。如果您只是使用记事本,则不需要这样做。
这是我正在使用的命令:
"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
在环顾了不同的地方之后。我设法想出的是,首先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\" %*"
您应该能够将 .sh 文件与 \CYGWIN\usr\bin\bash.exe 相关联。该脚本将不得不更改自己的工作目录,我建议在顶部粘贴这样的内容:
cd `dirname "$0"`
我使用 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 图标
然后:
对我来说就像一个魅力:O)
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
一种可行的解决方案是创建一个.bat
文件,该文件将打开 cygwin 并执行您的脚本。
go.sh
执行位于我的主目录中的脚本的脚本:
@echo off
C:
chdir C:\cygwin\bin
bash --login -i ./go.sh
查看 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
安装位置
我只是没有打扰。我将 .sh 文件与 Crimson 编辑器相关联(因为我花费的时间与实际运行它们的时间一样多)。现在需要在文件类型>高级中获得正确的“打开方式/编辑方式”组合。如果我知道 Crimson Editor 使用的 DDE 代码,那会更容易;然而,截至这篇文章我还没有找到它。
这让我想起了我的 Mac 时代(1993-2008 年),那时我曾经尝试扫描应用程序以获得更多基本的 AppleScript 脚本能力。
BZT
我自己开发了一个 .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 ===
所用语法的详细说明(如果您有兴趣):
for %%a in (%p%) do set p=%%~a
"%~1"
强制脚本文件的路径双引号,以便其文件夹分隔符'\'(在 %1 中)在被视为转义字符时不会被 bash 删除。否则,将路径中没有空格的文件拖动到此 .bat 时,它不起作用。喜欢:)