【问题标题】:Windows 10 Task Scheduler: Execute bash script without showing up cmdWindows 10 任务计划程序:执行 bash 脚本而不显示 cmd
【发布时间】:2018-05-17 03:49:38
【问题描述】:

我的计算机上有一项任务,从我的服务器下载每日备份。基本上是:

bash.exe -c "cd /mnt/d/server_backups && ./download_backup.sh"

这确实有效,但是它总是弹出 cmd 窗口,这实际上不会打扰我,如果不是因为它打断了我正在做的任何事情(游戏、看电影、工作)并且只是把我扔了到桌面。

将任务更改为“无论用户是否登录都运行”不起作用,因为显然 windows 会话零(无论是什么)无法使用 bash 发起调用。

是否有另一种方法可以不显示 cmd 窗口,或者在没有 SO 自行决定我希望它主要集中于它并最小化其他所有内容的情况下执行它?

【问题讨论】:

  • 那是控制台窗口,不是 CMD 窗口。与任何控制台应用程序一样,如果进程未标记为分离运行,则 bash.exe 会分配一个新控制台,即DETACHED_PROCESS。但是,经过测试,如果未设置进程控制台句柄,WSL 似乎无法初始化,即进程必须附加到控制台。您的选择是通过STARTUPINFO wShowWindow 字段创建不带窗口(即CREATE_NO_WINDOW)或隐藏窗口的控制台。
  • 在任何一种情况下,您都需要一种脚本语言(例如 Python 或 PowerShell)来控制如何创建 bash.exe 进程,因为任务调度程序不提供这种级别的控制。跨度>
  • 你能想象用 Cygwin 代替 Linux 的 Windows 子系统吗?

标签: windows bash cmd scheduled-tasks windows-subsystem-for-linux


【解决方案1】:

您可以使用 VBS 脚本在没有 cmd.exe 窗口的情况下启动 bash,如下所示:

hidden_​​launcher.vbs

Set WinScriptHost = CreateObject("WScript.Shell")
WinScriptHost.Run WScript.Arguments(0), 0
Set WinScriptHost = Nothing

在这里,我们运行收到的第一个参数,0 表示start the program hidden

现在在任务调度器中设置你的任务:

  • 要启动的程序:C:\Path\to\hidden_launcher.vbs
  • 参数:"bash.exe -c 'cd /mnt/d/server_backups && ./download_backup.sh' "

这应该可以解决问题!

【讨论】:

  • 看起来不错,但对我不起作用。将它放在任务调度程序或 .bat 文件(进行测试)显然什么都不做,并且执行 .vbs 会在第 2 行字符 1 上引发和错误“子索引超出范围”。因为我不知道 Windows 编程语言我不知道'不知道我是否做错了什么。
  • 您是否将"bash.exe -c 'cd/mnt/d/server_backups && ./download_backup.sh' " 放在任务调度程序的参数字段中使用这个确切的引号?(请确保将双引号/单引号完全按照它们的书写方式)。如果您尝试在没有参数的情况下执行脚本,它将引发错误,因为它会查找第一个参数(因此您收到“超出范围”消息)。如果你想检查脚本是否运行良好,你可以尝试传递"bash.exe -c 'echo it worked > /home/YOUR_USERNAME' ",它会在你的linux根文件夹中创建一个文件
  • 是的,我把论点和这个确切的引用放在了一起,实际上我是直接从你的答案中复制粘贴过来的。
  • 我做了一些测试,发现:从 cmd cscript hidden_launcher.vbs "bash.exe -c 'echo it worked > /home/MY_USERNAME/test.txt' " 执行完美,但不适用于"bash.exe -c 'cd/mnt/d/server_backups && ./download_backup.sh > /home/MY_USERNAME/log.txt' ",永远不会创建文件 log.txt。此外,两者都不能与任务调度程序一起使用。从调度程序调用 .vbs 脚本会提示对话框选择要打开的程序并等待用户响应。如果我将前面的命令放在 .bat 文件中,它会执行(或者看起来,控制台窗口会闪烁)但永远不会创建 test.txt
  • 您是否以提升的权限运行任务?也许bash.exe 需要具有管理员权限才能执行部分脚本或写信给/mnt/d。另外,cd/mnt/d/server_backups 有错别字,cd/mnt/d/server_backups 之间需要一个空格,即:cd /mnt/d/server_backups
【解决方案2】:

我建议你可以像wsl -e cd /mnt/d/server_backups && ./download_backup.sh这样使用WSL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    相关资源
    最近更新 更多