2016-06-27 6 views
0

ソフトウェアアップデートを自動的にインストールするスクリプトを作成しようとしています。既知のディレクトリに作成され、独自のフォルダを持つ定期的に新しいソフトウェアビルドがあります。 RスクリプトやRスクリプトで実行できるバッチファイルでは、過去24時間以内に新しいビルドが作成されたかどうかを確認するスクリプトを書いています。私は、Windowsエクスプローラでそのチェックを行うために "Date modified"カラムを使用する方法があるのだろうかと思っていました。したがって、今日が06/27/2016の場合、スクリプトは「現在の日付」 - 24時間後に「日付が変更された」フォルダを探します。その後、そのフォルダに移動して実行可能ファイルを実行し、自動インストールします。最新のソフトウェアビルドを自動的にインストールするRスクリプトまたはバッチファイル

これは実現可能ですか?

EDIT:r2evansは私の質問のほとんどに非常に徹底的な回答を提供しましたが、これがどれほど私をもたらしているかを示すために更新したいと思っていました。

これは私が彼の答えを実装した方法です。

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

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

私が探していたファイルが1つだけあれば、これは完全に機能します。しかし、実行可能ファイル(.msi)を持つ一連のサブディレクトリを分析する必要があります。だから、dfを最後の24時間で何が変わったのかを調べるために修正した後にdfを印刷すると、それは私にフォルダの名前だけを与えます。

//Path/to/Folders/FolderName 

私は、ファイルを実行するためにShell代わりのsystem2を使用して考えていました。 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 

また、重要なのは、どのように私はして追加することになり、私はこのようにそれを実装しようとしたshell(paste(shQuote("\\\\SERVER\\d$SERVER\\Path\\to\\the\\folder\\file.bat")), "cmd")

:私はこのようなシェルを使用して私の完全なスクリプトで、いくつかのバッチファイルを実行しますdfShellに変更すると、そのパスは可変になりますか?

EDIT 2:私のシェルの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

私はRが大好きですので、間違ってはいけません...しかし、なぜこの仕事にRを使いたいのですか? – Dason

+0

私はする必要はありません。しかし、私はRを使ってこのソフトウェアのデータを収集し分析するためのスクリプトを実行しているので、より便利になります。最終的には、このスクリプトをタスクスケジューラに追加して座って、そのスクリプトを実行させたいと考えています。 – David

+0

@Dasonだから、私はRスクリプトの中でそれを実行するだけなのでバッチファイルを使用しても構いません。 – David

答えて

1

あなたがディレクトリ内のどのファイルを見つけることができますが、このようなもので、最近更新されています。

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

dfは単なるデータです。フレーム上にいくつかの基本フィールドがあります。

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"  

から:あなたがそれらを直接アクセスするか、自身が行名です

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" ... 

ファイル名:だから、私のマシン上の特定のパスについては(合流プラットフォーム用ドッキングウィンドウのもので)ここでは、それは、mtime(更新時刻)に基づいてフィルタリングするために十分に簡単です:

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

(私は最後の日に、1つのファイルを変更した。)

次のステップ(実際にアプリケーションを更新する)が完全なパスであれば、すべて正常です。あなたがリードするものを削除する必要があるとされていない場合、それを行うための2つの簡単な方法があります。

  1. setwd("/path/to/dir")との最初のディレクトリに変更し、その後df <- file.info(list.files())は、または

  2. その先導パスなしでファイル名を返す返された(フィルタリング)、ファイル名、ファイル名を指定して実行basename(...)

私は後者の方が好きです(現在の作業ディレクトリに依存したい、または変更したくない)が、これは個人の好みです。

実際に更新に影響を与えることは別の問題です。単に「更新されたアプリケーションを実行する」なら、?system2を調べることをお勧めします。

+0

これは非常に徹底的な答えです。しかし、私はまだ興味があることがいくつかあります。私はそれを扱うために編集を行い、より良いコードを表示するつもりです。 – David

+0

編集がアップしています。私が思っていたよりも時間がかかった、または私がそれを作ってしまうまでコメントを待っていただろう。 – David

関連する問題