概要
サーバー上のファイルとローカルのファイルの最終更新日を比較して起動するファイルを選別する
要件
①サーバーのファイルが新しいorローカルファイルがない=ダウンロードして起動
②ローカルのファイルが新しい=ローカルファイルを起動
実装
①WEBディレクトリに対象のファイルを配置
②テキストファイルに以下コードを貼り付け.ps1で保存
ps1
$url = "http:///test.xlsm"
$localFilePath = "C:\test\test.xlsm"
#-- 多重起動防止
if((Get-Process|Where-Object{$_.MainWindowTitle -like '*test.xlsm*'}).Count -gt 0)
{
Exit
}
#-- サーバーファイルのレスポンスを取得
$response = Invoke-WebRequest -Uri $url
#-- 最終更新日を取得
$lastModified = $response.Headers.'Last-Modified'
#-- 日付型に変換
$lastModifiedDate = [DateTime]::ParseExact($lastModified, "ddd, dd MMM yyyy HH:mm:ss 'GMT'",
[System.Globalization.CultureInfo]::InvariantCulture, [System.Globalization.DateTimeStyles]::AssumeUniversal)
#-- フォーマットして変数へ格納
$server = $lastModifiedDate.ToString("yyyy-MM-dd HH:mm:ss")
#-- ローカルファイルの存在チェック
$fileExists = (Test-Path $localFilePath)
if($fileExists){
#-- ローカルファイルがある
#-- フォーマットして変数へ格納
$local = (Get-ItemProperty $localFilePath).LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss")
if($server -gt $local){
#-- サーバーのファイルが新しい場合はダウンロード
Invoke-WebRequest -uri $url -outfile .\test.xlsm
#-- 終了遅延
Start-Sleep -s 2
#--
Write-Host "最新ファイルをダウンロード中" -ForegroundColor White -BackgroundColor DarkCyan
#-- Web のマークを削除する
Get-ChildItem -Recurse -File | ?{
$_ | Get-Item -Stream Zone.Identifier -ErrorAction Ignore;
} | Remove-Item -Stream Zone.Identifier;
}else{
#-- ローカルのファイルが新しい場合はダウンロードしない
Write-Host "起動中" -ForegroundColor White -BackgroundColor DarkGreen
}
}else{
#-- ローカルのファイルがない場合はダウンロード
Invoke-WebRequest -uri $url -outfile .\test.xlsm
#-- 終了遅延
Start-Sleep -s 2
#--
Write-Host "最新ファイルをダウンロード中" -ForegroundColor White -BackgroundColor DarkCyan
#-- Web のマークを削除する
Get-ChildItem -Recurse -File | ?{
$_ | Get-Item -Stream Zone.Identifier -ErrorAction Ignore;
} | Remove-Item -Stream Zone.Identifier;
}
#-- VBA起動
try {
$excel = New-Object -ComObject Excel.Application
# 表示する・しない
$excel.Visible = $false
# ブックを開く
$book = $excel.Workbooks.Open([string](Resolve-Path (Get-ChildItem "test.xlsm")))
}
finally {
# プロセスを開放する
$excel = $null
[GC]::Collect()
Exit
}