我正在尝试创建一个自动安装软件更新的脚本。有一些新的软件版本在已知目录中创建并拥有自己的文件夹。在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")
答案 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"
(我在最后一天只修改了那个文件。)
如果您的下一步(实际更新应用程序)是完整路径,那么一切都很好。如果没有,你需要删除主要的东西,有两种简单的方法可以做到这一点:
首先使用setwd("/path/to/dir")
然后df <- file.info(list.files())
更改为目录;或
对返回的(已过滤的)文件名运行basename(...)
,返回不带前导路径的文件名。
我更喜欢后者(不想依赖或更改当前的工作目录),但这只是个人偏好。
现在实际影响更新是另一个问题。如果您只是“运行更新的应用程序”,那么我建议您查看?system2
。