R脚本或批处理文件自动安装最新的软件构建

时间:2016-06-27 16:05:55

标签: r batch-file installation automation

我正在尝试创建一个自动安装软件更新的脚本。有一些新的软件版本在已知目录中创建并拥有自己的文件夹。在R或我可以在R脚本中执行的批处理文件中,我想编写一个脚本来检查是否在过去24小时内创建了任何新版本。我想知道是否有办法使用"日期修改" Windows资源管理器中的列进行检查。因此,如果今天是2016年6月27日,该脚本将查找具有"日期修改的任何文件夹"在"当前日期" - 24小时。然后它将导航到该文件夹​​并执行可执行文件并自动安装。

这是否可行?

编辑:r2evans为我的大部分问题提供了一个非常彻底的答案,但我想做一个更新,以显示这给我带来了多远。

这就是我实施答案的方式。

path <- "//Path/to/Folders/"
df <- file.info(list.files(path, full.names = TRUE))

df <- rownames(df)[ df$mtime > Sys.time() - 60*60*24 ]

如果我有一个我正在寻找的文件目录,这将完美地工作。但是,我需要分析一系列具有可执行文件(.msi)的子目录。因此,当我在修改df后修改它以查找过去24小时内发生的变化时,它只会给我一个文件夹的名称。

//Path/to/Folders/FolderName

我在考虑使用Shell代替system2来执行该文件。我使用Shell在我的完整脚本中执行几个批处理文件,如下所示:shell(paste(shQuote("\\\\SERVER\\d$SERVER\\Path\\to\\the\\folder\\file.bat")), "cmd")

我尝试像这样实现:shell(paste(shQuote("\\\\SERVER\\d$SERVER\\Path\\to\\the\\folder\\dffolderName\\*")), "cmd")但是这给出了这个错误:

CMD.EXE was started with the above path as the current directory.
UNC paths are not supported.  Defaulting to Windows directory.
The network name cannot be found.
Warning messages:
1: running command 'cmd /c "\\SERVER\d$\SERVER\Path\to\dffolderName\*"' had status 1 
2: In shell(paste(shQuote("\\\\SERVER\\d$SERVER\\Path\\to\\the\\folder\\dffolderName\\*")),  :
  '"\\SERVER\d$\SERVER\Path\to\dffolderName\*"' execution failed with error code 1

此外,重要的是,我如何将df变量添加到Shell以使路径变为可变?

编辑2 :这是我的shell cmd行的一个工作示例。

我创建了一个要执行的测试批处理文件。此批处理文件应该执行R脚本中正在执行的所有相关操作(即,从远程服务器中提取变量)。

@ECHO off

set var1=%1
set var2=%2

ECHO %var1%
ECHO %var2%
ECHO This batch file is working

pause

然后尝试这个R脚本:

var1 <- 1
var2 <- 2

shell(paste(shQuote("\\\\SERVER\\d$\\SERVER\\Path\\To\\the\\File\\TestBat.bat"), var1, var2), "cmd")

1 个答案:

答案 0 :(得分:1)

您可以使用以下内容找到目录中的哪些文件已更新:

path <- "path/to/files/"
df <- file.info(list.files(path, full.names = TRUE))

df只是一个data.frame,其中包含文件的一些基本字段。对于我机器上的特定路径(使用docker的东西用于汇合平台):

str(df)
# 'data.frame': 5 obs. of  7 variables:
#  $ size : num  0 1434 0 0 0
#  $ isdir: logi  TRUE FALSE TRUE TRUE TRUE
#  $ mode :Class 'octmode'  int [1:5] 511 438 511 511 511
#  $ mtime: POSIXct, format: "2016-06-15 08:01:41" "2016-06-27 10:07:12" ...
#  $ ctime: POSIXct, format: "2016-06-15 08:00:22" "2016-06-15 08:49:39" ...
#  $ atime: POSIXct, format: "2016-06-15 08:01:41" "2016-06-27 09:15:55" ...
#  $ exe  : chr  "no" "no" "no" "no" ...

文件名本身就是行名,因此您可以使用以下命令直接访问它们:

rownames(df)
# [1] "C:\\Users\\r2/Projects/kafka/confluent-3.0.0"    
# [2] "C:\\Users\\r2/Projects/kafka/docker-kafka-notes" 
# [3] "C:\\Users\\r2/Projects/kafka/kafka_2.11-0.10.0.0"
# [4] "C:\\Users\\r2/Projects/kafka/tmp"                
# [5] "C:\\Users\\r2/Projects/kafka/zookeeper-3.4.8"    

从这里开始,过滤mtime(修改时间)就足够了:

rownames(df)[ df$mtime > Sys.time() - 60*60*24 ]
# [1] "C:\\Users\\r2/Projects/kafka/docker-kafka-notes"

(我在最后一天只修改了那个文件。)

如果您的下一步(实际更新应用程序)是完整路径,那么一切都很好。如果没有,你需要删除主要的东西,有两种简单的方法可以做到这一点:

  1. 首先使用setwd("/path/to/dir")然后df <- file.info(list.files())更改为目录;或

  2. 对返回的(已过滤的)文件名运行basename(...),返回不带前导路径的文件名。

  3. 我更喜欢后者(不想依赖或更改当前的工作目录),但这只是个人偏好。

    现在实际影响更新是另一个问题。如果您只是“运行更新的应用程序”,那么我建议您查看?system2