Cygwin - 从“运行命令”中静默运行脚本

43

我有一个脚本,比如说:

C:\foo.bsh

我想通过Windows运行命令来运行此命令:

Start -> Run
Windows Key + R

输入一些小的内容像'foo'并按回车键。

然而,我不想让命令提示符可见。这个脚本会为一个IDE进行一些预处理。我不希望命令提示符在IDE进程的生命周期内一直处于打开状态。

我已经尝试了:

1)创建一个包含以下内容的批处理文件:

c:\cygwin\bin\bash --login "C:\foo.bsh" (this fails because it keeps a cmd open)

2) 使用bat_2_exe_converter将上述bat文件转换为exe(不能使cmd静默)

有什么想法吗?

编辑:到目前为止,解决方案建议从实际的cygwin shell中输入一些内容。我正在尝试通过输入在Windows运行命令中可以输入的简短内容来获得更快的解决方案。此外,“nohup命令; exit”不会自动关闭窗口-但是我可以手动关闭它而不关闭IDE进程。运行命令接受快捷方式(.lnk's),bat's,exe's。

7个回答

46
尝试使用cygwin的run.exe命令。这是一个大型安装程序,为您的Windows机器提供完整的Unix环境。假设您将其安装在c:\cygwin\
没有神秘,只需运行c:\cygwin\bin\run.exe <your command here>,您就可以执行无DOS窗口。
您可以从任何DOS窗口(从开始菜单运行cmd.exe)运行它。您不需要从cygwin运行它。
为了使它更容易,将C:\cygwin\bin附加到您的%PATH% env变量中(我的电脑→属性→高级→环境变量)(感谢Felipe Alvarez的评论)。
现在您只需输入
c:\cygwin\bin\run.exe "C:\foo.bsh"

您需要在开始菜单中创建一个链接,使用此命令才能使用Win-R键运行它。

这是runcommand的手册页面:

$ man run
RUN(1)                             run 1.3.0                            RUN(1)

NAME
       run - start programs with hidden console window

SYNOPSIS
       run [ -p path ] command [ -wait ] arguments

       runcommand [ -p path ] [ -wait ] arguments

DESCRIPTION
       Windows  programs  are  either  GUI  programs or console programs. When
       started console  programs  will  either  attach  to an existing console
       or  create a new one. GUI programs can  never attach to an exiting con‐
       sole. There is no way to attach to an existing console but hide  it  if
       started as GUI program.

       run  will  do this for you. It works  as intermediate and starts a pro‐
       gram but makes the console window hidden.

       With -p path you can add path to the PATH environment variable.

       Issuing -wait as first program  argument will make run wait for program
       completition, otherwise it returns immediately.

       The  second  variant  is  for   creating wrappers. If the executable is
       named runcommand (eg runemacs), run will try  to start the program  (eg
       emacs).

EXAMPLES
       run -p /usr/X11R6/bin xterm

       run emacs -wait
       runemacs -wait

       run make -wait

AUTHORS
       Charles S. Wilson

       Harold L Hunt II

       Jehan Bing

       Alexander Gottwald

Version 1.3.0                    November 2005                          RUN(1)

1
不好:它仍然会打开一个终端窗口,然后关闭它,夺走焦点并使任务栏闪烁。 - Glenn Maynard
1
我可以使用run命令来执行.sh Shell脚本吗? - myloginid
2
有没有一种方法可以获取输出? - Lime
1
我在我的Cygwin安裝中沒有“run”命令,但是我可以使用“cygstart”命令(該命令似乎模擬了雙擊圖標,在cmd窗口中啟動所點擊的項目)來運行批處理文件。 - user151841
2
要获取输出,请改用bash命令:C:\\cygwin64\\bin\\bash --login -c 'foo.bsh',而不是使用@Lime。 - HyperActive
显示剩余2条评论

21

You can use either...

c:\cygwin\bin\bash -l /path/to/script_to_interpret.sh

...或者...

c:\cygwin\bin\bash -l -c /path/to/executable_script.sh

注意: -l 标记告诉bash“模拟直接通过登录调用”,并使用 Bash启动文件。 这很重要,因为它设置了您启动cygwin终端时依赖的 $PATH 和其他一些东西。 如果您不包含 -l--login,则在尝试调用除bash内置命令以外的任何内容时,将出现“找不到命令”的错误。
这两者之间的区别就像执行以下操作的区别...
bash script_to_interpret.sh

...和...

./executable_script.sh

...在*nix中运行脚本有两种方法。前者使用bash解释脚本。后者执行脚本(仅当它有chmod +x executable_script.sh)并根据其"shebang"行进行解释。如果你的可执行文件根本不是脚本,比如从源代码编译的*nix二进制文件,那么你也需要使用后一种方法。


非常感谢您的回答!问题是,当我执行我的脚本时,我会得到以下错误:C:/cygwin64/home/ale/kmeans2: line 148: awk: command not found C:/cygwin64/home/ale/kmeans2: line 149: dirname: command not found C:/cygwin64/home/ale/kmeans2: line 150: basename: command not found C:/cygwin64/home/ale/kmeans2: line 306: mkdir: command not found。您有任何想法可能出了什么问题吗? - Alejandro Lozdziejski
1
发布一个新帖子。在评论中提问不会得到帮助。同时请发布你的脚本。 - Felipe Alvarez
@AlejandroLozdziejski 在该 Bash 中的 $PATH 将缺少 /bin/ 等内容。 - Leif Gruenwoldt
@AlejandroLozdziejski 尝试使用 c:\cygwin\bin\bash -l -c /path/to/script,这对我有效。 - graywolf
“-l -c” 的解决方案对我来说几乎完美,除了我还需要将参数传递给 Bash 脚本,但由于某种原因它无法识别它们... - still_dreaming_1
实际上,如果我只使用“-l”而不使用“-c”,它会接受这些参数,所以这对我有用。 - still_dreaming_1

11

这个问题已经困扰我一段时间了,但最终我找到了正确的解决方案。

如果你的PATH变量中有cygwin,你可以简单地执行以下命令:
run bash test.js

如果PATH变量中没有cygwin,你可以执行以下命令:
c:\cygwin\bin\run.exe -p /bin bash test.js

如果你想对创建的窗口进行更多控制(最大化等),看起来你也可以使用cygstart

来源:
- 上面的neves回答(但那对我个人来说还不够)
- http://cygwin.com/ml/cygwin/2008-09/msg00156.html


如果我没记错的话,cygstart 可以让 Windows 打开命令/链接等,例如你可以输入 cygstart file://C:/,它会打开指向 C:/ 的 Windows 资源管理器,而 run 没有这个功能。另一方面,如果你没有设置 Windows 环境来使用 bash 打开 .sh 文件(使用 assocftype),cygstart 可能无法打开它们,而 run 可能可以(我没有测试过)。 - Gene Pavlovsky

4

由于终端在脚本仍在运行时无法关闭,请尝试使用以下命令:

"nohup C:\foo.bsh; exit" 

这样,您的脚本将被后台运行并与终端分离,它应该很快退出,以便终端消失。我认为使用此方法可能仍会导致窗口“闪烁”,但结果应该比您目前得到的更好。


3
我正在运行Cygwin64,并且xwin服务器的链接指向:
C:\cygwin64\bin\run.exe /usr/bin/bash.exe -l -c /usr/bin/startxwin.exe 这会创建一个图标和一个任务栏通知。我不喜欢那个图标,通知中包含你在.XWinrc中的所有菜单选项。
因此……我编写了一个.vbs脚本来静默运行此命令并使图标消失:
Set objShell = CreateObject("WScript.Shell")
objShell.Run("C:\cygwin64\bin\run.exe /usr/bin/bash.exe -l -c /usr/bin/startxwin.exe"), 0

2
另一种不完美的可能是通过快捷方式运行脚本,并将快捷方式的“运行”选项设置为“最小化”。

0

前往你安装Cygwin的目录(在我的机器上是c:/cygwin64/bin) 到那里后,只需键入"bash.exe"。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接