Get the last modified date of a remote file
From php's article:
<?php
// outputs e.g. somefile.txt was last modified: December 29 2002 22:16:23.
$filename = 'somefile.txt';
if (file_exists($filename)) {
echo "$filename was last modified: " . date ("F d Y H:i:s.", filemtime($filename));
}
?>
filemtime() is the key here. But I'm not sure if you can get the last modified date of a remote file, since the server should send it to you... Maybe in the HTTP headers?
How can I fetch the last-modified value of a remote file?
You can use the System.Net.Http.HttpClient
class to fetch the last modified date from the server. Because it's sending a HEAD
request, it will not fetch the file contents:
Dim client = New HttpClient()
Dim msg = New HttpRequestMessage(HttpMethod.Head, "http://google.com/robots.txt")
Dim resp = client.SendAsync(msg).Result
Dim lastMod = resp.Content.Headers.LastModified
You could also use the If-Modified-Since
request header with a GET
request. This way the response should be 304 - Not Modified
if the file has not been changed (no file content sent), or 200 - OK
if the file has been changed (and the contents of the file will be sent in the response), although the server is not required to honor this header.
Dim client = New HttpClient()
Dim msg = New HttpRequestMessage(HttpMethod.Get, "http://google.com/robots.txt")
msg.Headers.IfModifiedSince = DateTimeOffset.UtcNow.AddDays(-1) ' use the date of your copy of the file
Dim resp = client.SendAsync(msg).Result
Select Case resp.StatusCode
Case HttpStatusCode.NotModified
' Your copy is up-to-date
Case HttpStatusCode.OK
' Your copy is out of date, so save it
File.WriteAllBytes("C:\robots.txt", resp.Content.ReadAsByteArrayAsync.Result)
End Select
Note the use of .Result
, since I was testing in a console application - you should probably await
instead.
Get last modified date of a remote file
Generally, you can check the file time by sending HEAD request and parsing/looking HTTP header response for a Last-Modified
filed. The remote server should support it and DropBox does not support this feature for direct links (only via API). But DropBox have another feature, the headers have the etag
field. You should store it and check in the next request. If it changed - the file has been changed too. You can use this tool to check the remote file headers.
How to get the modified time of a remote file in batch script
Try a dir
.
Or use a for loop differently.
for %%A in (\\server\C$\Temp\LogFiles\abcd) do echo %%~tA
A working example if pasted into a command prompt.
for %A in (\\127.0.0.1\C$\windows\win.ini) do echo %~tA
To the other question you sneeked in
more +50
skips first 50 lines.
This VBScript does what you want.
Set Arg = WScript.Arguments
Set WshShell = createObject("Wscript.Shell")
Set Inp = WScript.Stdin
Set Outp = Wscript.Stdout
Set rs = CreateObject("ADODB.Recordset")
With rs
.Fields.Append "LineNumber", 4
.Fields.Append "Txt", 201, 5000
.Open
LineCount = 0
Do Until Inp.AtEndOfStream
LineCount = LineCount + 1
.AddNew
.Fields("LineNumber").value = LineCount
.Fields("Txt").value = Inp.readline
.UpDate
Loop
.Sort = "LineNumber ASC"
If LCase(Arg(1)) = "t" then
If LCase(Arg(2)) = "i" then
.filter = "LineNumber < " & LCase(Arg(3)) + 1
ElseIf LCase(Arg(2)) = "x" then
.filter = "LineNumber > " & LCase(Arg(3))
End If
ElseIf LCase(Arg(1)) = "b" then
If LCase(Arg(2)) = "i" then
.filter = "LineNumber > " & LineCount - LCase(Arg(3))
ElseIf LCase(Arg(2)) = "x" then
.filter = "LineNumber < " & LineCount - LCase(Arg(3)) + 1
End If
End If
Do While not .EOF
Outp.writeline .Fields("Txt").Value
.MoveNext
Loop
End With
To use
Filter reads and writes standard in and standard out only. These are only available in a command prompt.
filter <inputfile >outputfile
filter <inputfile | other_command
other_command | filter >outputfile
other_command | filter | other_command
Cut
filter cut {t|b} {i|x} NumOfLines
Cuts the number of lines from the top or bottom of file.
t - top of the file
b - bottom of the file
i - include n lines
x - exclude n lines
Example
filter cut t i 5 < "%systemroot%\win.ini"
How do you obtain modified date from a remote file (Java)?
Any decent webserver will put this information in the Last-Modified
response header. You can obtain it by URLConnection#getLastModified()
. Here's an example:
URLConnection connection = new URL("https://cdn.sstatic.net/Img/unified/sprites.svg").openConnection();
long lastModified = connection.getLastModified();
System.out.println(lastModified); // 1649805134000
You can then easily convert it the desired date type. E.g. Instant
:
Instant instant = Instant.ofEpochMilli(lastModified);
System.out.println(instant); // 2022-04-12T23:12:14Z
Or the legacy java.util.Date
:
Date date = new Date(lastModified);
System.out.println(date); // Tue Apr 12 19:12:14 AST 2022
Batch Script Get Last Modified Date of Remote File
Groan...
This has got to be the most common bug with Windows batch development. You are attempting to expand a variable that was set within the same code block. But the variable is expanded when the entire code block is parsed, so you are getting the value that existed prior to the block of code being executed. That obviously doesn't work.
Type HELP SET
or SET /?
from the command prompt and read the section dealing with Delayed Expansion. That shows you one way to solve the problem.
But in your case you don't need the variable at all, so you don't need delayed expansion. Simply use the FOR variable directly when you append to your bodyText:
@echo off
set mainDir=\\subdomain.myintranet.net\c$
set txtFile=%mainDir%\tmp.txt
set txtFile2=%mainDir%\tmp2.txt
set "bodyText=^<p^>Hello,^<br /^>^<br /^>"
if exist %txtFile% (
for %%X in (%txtFile%) do set "bodyText=%bodyText%tmp.txt file updated as of %%~tX^<br /^>"
) else (
set "bodyText=%bodyText%Warning: Issues finding %txtFile%.^<br /^>"
)
if exist %txtFile2% (
for %%X in (%txtFile2%) do set "bodyText=%bodyText%tmp2.txt file updated as of %%~tX^<br /^>"
) else (
set "bodyText=%bodyText%Warning: Issues finding %txtFile2%.^<br /^>"
)
set "bodyText=%bodyText%^</p^>"
echo %bodyText% > %mainDir%\mylog.txt
EDIT
There is a lot more room for simplification that should make the code easier to maintain. Since you are preparing an HTML file, there is no reason to worry about additional line breaks, so you don't have to put all of the text into one variable. You can use multiple ECHO statements. I would structure your code something like the following (untested, but the concepts are sound):
@echo off
setlocal
set "mainDir=\\subdomain.myintranet.net\c$"
set "br=^<br /^>"
set "p=^<p^>"
set "/p=^</p^>"
>"%mainDir%\mylog.txt" (
echo %p%Hello,%br%%br%"
for %%F in (
"%mainDir%\tmp.txt"
"%mainDir%\tmp2.txt"
) do (
if exist %%F (
echo %%~nxF file updated as of %%~tF%br%"
) else (
echo Warning: Issues finding %%~nxF.%br%"
)
echo %/p%
)
How to check the modify time of a remote file
You can use the HTTP "HEAD" method to just get the file's headers.
...
var request = WebRequest.Create(uri);
request.Method = "HEAD";
...
Then you can extract the last modified date and check whether to download the file or not.
Just be aware that not all servers implement Last-modified properly.
Bash - How to compare two files last modified date, when they are remote?
Try this:
remote=$(ssh user@server "stat -c %Y /path/to/remote_file")
[[ -z "$remote" ]] && exit 1 # stop on error ($remote is empty)
local=$(stat -c %Y /path/to/local_file)
if [[ $remote -gt $local ]]; then
echo remote file is newer
else
echo local file is newer
fi
Related Topics
Integrating Mailjet API V3 Wrapper as Codeigniter Library
Enabling Postgresql Support in PHP on MAC Os X
How to Write a Stored Procedure in PHPmyadmin
Algorithms for String Similarities (Better Than Levenshtein, and Similar_Text)? PHP, Js
Excel Date Conversion Using PHP Excel
PHP Serial Port Data Return from Arduino
Add Fee Based on Specific Payment Methods in Woocommerce
Get MySQL Query Results as Their Native Data Type
Simplexml How to Prepend a Child in a Node
Output Is in Seconds. Convert to Hh:Mm:Ss Format in PHP
Can PHP's Glob() Be Made to Find Files in a Case Insensitive Manner
PHP Using Preg_Replace:"Delimiter Must Not Be Alphanumeric or Backslash" Error
Getting Actual Value from PHP Simplexml Node
Bind_Param Number of Variables Doesn't Match Number of Parameters in Prepared Statement
Inkscape Inside PHP/Apache Doesn't Render Fonts to Png