在Windows中安排运行Bash Shell脚本的计划

3
感谢您的帮助,如果我的术语不正确请见谅。
这是一个脚本(*.sh文件),它执行以下操作: 1. 进入特定目录A 2. 从另一个目录B复制文件到目录A 3. #已注释# 它还会解压目录A及其子目录中的文件 4. #已注释# 它还会删除目录A中所有*.csv文件的前6行和最后一行。
#!/bin/bash

# Configure bash so the script will exit if a command fails.
set -e 

#cd to the dir you want to copy to:
cd /cygdrive/c/path/I/want/to/copy/to
#echo Hello

#cp the files i want 
#include the subdirectories 
cp -r /cygdrive/c/path/I/want/to/copy/from/* .

# This will unzip all .zip files in all subdirectories under this one.
# -o is required to overwrite everything that is in there
#find -iname '*.zip' -execdir unzip -o {} \;

#find ./ -iname '*.csv' -exec sed -i '1,6d;$ d' '{}' ';'

现在我可以通过进入文件所在的目录并输入以下命令在cygwin中使该脚本工作:
./filename.sh

或者
/cygdrive/c/path/where/the/file/is/filename.sh

或者

bash filename.sh

我也可以通过在CMD/Windows DOS中执行以下操作来完成这个任务:
C:\cygwin\bin\bash.exe -l 

进入bash终端,然后输入以下命令:

/cygdrive/c/path/where/the/file/is/filename.sh

在任务计划程序(Windows中),我尝试安排以下任务:

C:\cygwin\bin\bash.exe -l /cygdrive/c/path/where/the/file/is/filename.sh

但是,尽管我已经在CMD / Windows DOS中说过这些单独的命令可以工作,但这并不起作用。
现在我想做的是像在Windows中使用任务计划程序一样调度此脚本(filename.sh),类似于.vbs或.bat文件? 有人能给些建议吗?
请注意,我尝试编写了一个Windows批处理文件(.bat)来执行此操作(请参见下文),但我无法使我的解压缩和sed命令起作用,请参阅此处。 因此,我尝试编写了上面的Bash shell脚本。
chdir C:\pointA
C:\cygwin\bin\cp.exe /cygdrive/v/pointB/* .
::find -iname *.zip -execdir unzip {} \;
::find ./ -iname '*.csv' -exec sed -i '1,6d;$ d' '{}' ';' 

类似的问题在这里被问到了:https://dev59.com/wXfZa4cB1Zd3GeqPWM7d - HattrickNZ
2个回答

3

一种解决方案是将.sh文件与运行bash的批处理文件关联起来。这样,每当您告诉Windows执行一个sh文件时,它都会使用正确的启动程序-无论是通过双击还是计划任务。这是我的:

@echo off

d:
chdir d:\cygwin\bin

bash --login %*

关联文件类型意味着当您尝试执行该类型的文件时,Windows将使用该文件的路径作为参数传递给指定的程序。例如,我将LibreOffice4与.ods文件相关联。因此,如果我双击一个.ods文件,或者只是在命令提示符中输入.ods文件的路径,Windows将运行open office calc,并将第一个参数设置为ods文件。因此,如果我在桌面上有Untitled.ods文件,我双击它,这实际上相当于打开命令提示符,键入
然后按回车键。确实,如果我这样做,所预期的结果会发生:open office calc启动并加载文件。如果您将关联更改为echo.exe(我在D:\cygwin\bin中找到),则可以看到它的工作原理。如果我更改关联为echo,打开命令提示符并键入

"C:\Users\Adam\Desktop\Untitled.ods"

我会看到echo.exe回显文件名给我。
所以我建议你这样做:
1. 创建一个批处理文件,使用Cygwin的bash运行bash脚本(或者使用我的)。 2. 将.sh文件的关联更改为该批处理文件。 3. 直接执行那些.sh文件,就像它们是.exe或.bat文件一样。

这个问题的解决方案如下。我将其放在脚本的开头,然后双击 *.bat 文件,会出现带有 cygwin CLI 的 CMD/DOS 窗口。听起来没问题吧? - HattrickNZ
不,将*.sh与批处理文件关联,然后运行您的sh文件。我会编辑我的答案来解释如何关联文件类型。 - Adam R. Grey
1
感谢您,我还发现了另一种方法,可以在任务计划程序的“运行”中输入以下命令:C:\cygwin\bin\bash.exe -c -l '/cygdrive/c/path/where/the/file/is/filename.sh',但是您不能通过双击.sh文件来执行此操作。 - HattrickNZ
谢谢Adam,但我刚刚发现有时这对我不起作用,我已经在这里发布了问题,如果您愿意评论。 - HattrickNZ

0
为什么不创建一个批处理文件(.bat),加载你的cygwin bash脚本并安排这个批处理文件?这样你就不必处理M$处理参数的方式了。

我已经尝试了亚当的建议,但不确定我是否正确地尝试了它。您能否给出一个具体的例子,以我上面提供的内容为基础? - HattrickNZ
明天我会尝试一下,因为我现在没有Windows机器可用,因为我家里的所有机器都是Linux ;-) - Sebastian Heyn

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