CMD echo %date% returns '/Tu' instead of a proper date - date

I am generating the date in a format of YYYYMMDD so that i can append it in the filename that the batch program generates.
But in my local system echo %date% returns
echo %date%
Tue 09/08/2015
The date information is returned so i can modify it the way i want
In server, the same does not return date values
echo %date%
/Tu
I dont have date values to modify it to my required format YYYYMMDD
How do I go about this? Is there any Windows date and time setting that i should be looking at?

The date format depends on the regional settings of your machine. You can check them in control panel (run intl.cpl), they seem to be broken.

Related

Bash script to modify the last modified date using the file name

I downloaded all the pictures from an old spanish social network and the Last modified date is the date that I downloaded the file instead of the real date. I would like to order all the pictures by Last modified date to upload to google photos using the correct date.
I know the real date because the image name has the date and time and I would make a script to change de last modified date using the name of the file. I don't care about the time.
Name of the file format: "yyyy-mm-dd hh-mm-ss.jpg"
I'm using windows, but is not a problem to install Unix to execute some bash script, because it may probabbly be easier.
Is there any way to do this?
Thanks in advance
You can use powershell $(Get-Item *Filename*).creationtime=$(Get-Date "mm/dd/yyyy hh:mm am/pm") in a batch file or command prompt to change the creation date of a file. for more information look at this. In your case you could do:
for %%i in (<folder with all the files path>) do (
set name=%%~i
set name=%name:~0,19%
powershell $(Get-Item %%~i).creationtime=$(Get-Date "%name:~5,2%/%name:~8,2%/%name:~0,4% %name:~11,2%:%name:~14,2%")
)
Note: I have not tested this since I do not have the data set for it.

How to get Current Date - 1, -2 ,-3 , -4 in Batch

This is what i would like to do:
Get Current Date, which is easy --- %DATE%
DO Current Date - 1, which i cant seem to get as i have tried different options.
I would like to get last 4 dates from the current date and then store them in 4 different variables. Then Convert each of these date into YYYYMMDD format.
So %DATE% gives me 06/04/2016.....
%DATE%
-1 should give me 05/04/2016 stored in Variable say Date1........
-2 should give me 04/04/2016 stored in Variable say Date2........
-3 should give me 03/04/2016 stored in Variable say Date3........
-4 should give me 02/04/2016 stored in Variable say Date4........
then i would like to convert value stored in each of these variables into YYYYMMDD
For ex:
05/04/2016 to 20160405 ....
04/04/2016 to 20160404 ....
03/04/2016 to 20160403 ....
02/04/2016 to 20160402 ....
with a little help from powershell:
#echo off
for /l %%d in (0,1,4) do (
for /f "tokens=*" %%i in ('powershell get-date -date $(get-date^).adddays(-%%d^) -format yyyyMMdd') do set _Date%%d=%%i
)
set _date
Explanation (copied word by word from TessellatingHeckler's comment - couldn't formulate it better):
for /L is a batch file loop which counts numbers, 1 2 3 4, and each
time through it calls PowerShell script engine with a for /f command
which is a bit of a batch file workaround. The PowerShell command gets
the current date, adds -X days to it, then gets the resulting date,
and formats it in the way you want and returns it to the batch file,
which gets one line of text back, and uses that in the do section to
set the environment variable. tokens=* tells the loop not to split the
line of text up, and the ^ are to escape special characters in batch
files
for /l works like this: for /l %%i in (<start>, <step>, <end>). In other languages it would read something like FOR i=<start> TO <end> STEP <step>
The powershell command assembles like this:
get-date - get today's date.
get-date -date <some date> get the date of <some date> (seems absurd, but in fact means "take the string <some date> and convert it to a valid date").
Now replace <some date> with $(get-date).adddays(x) - which means "take today, and add x days"
last step is formatting the resulting date to the desired format with -format <formatstring>
you can read powershell's help from cmd with powershell get-help get-date or more detailed: powershell Get-Help Get-Date -Online

How do I find last Sunday's date and save it in a variable in a Windows batch file

I have a script that needs to connect to an ftp server and download a file that is only created on Sunday and Sunday's yyyy-mm-dd-hh-mm-ss is appended to the file name. I need to find the last Sunday's date (based on today's date, I assume) and convert it to yyyy-mm-dd (I don't care about the time) so I can construct the filename in my ftp script. I have searched a lot of threads on this and other sites, but I'm kind of a novice at batch syntax. I cannot make assumptions about the date format on the machine that will run this script, but it will be in the same timezone as the ftp server and it will be running at least Windows 7. I thought about using the PowerShell solution in HOW to find last SUNDAY DATE through batch but I've read there are issues with PS script portability. Any help is greatly appreciated. Let me know if I need to provide more detail. Thanks!
(Get-Date).AddDays(-(get-date).dayofWeek.value__)
A couple years ago I wrote a batch script to find yesterday's date. I made it able to calculate 'yesterday' based on today's date. It takes into account months ending on the 30th or 31st, and even the next few leap years. The way I wrote it expects the date to be in the format 'Wed 02/24/2016' or 'ddd MM/DD/YYYY', so it may not be useful to you.
As I look at it now, it's probably more complicated than it needs to be and could probably use some cleanup, but it worked for my purposes. You might be able to modify it somehow to make it find last Sunday, instead of yesterday.
set yearCounter=0
set yyyy=%date:~10,4%
set mm=%date:~4,2%
set dd=%date:~7,2%
::use these to override the actual date values for testing
::set yyyy=xxxx
::set mm=xx
::set dd=xx
if %dd%==01 goto LDoM ::Last Day of Month
set DS=%yyyy%%mm%%dd%
set /A yesterday=%DS%-1
goto endyesterday
:LDoM
set /A lastyyyy=%yyyy%-%yearCounter%
if %yesterday:~4,2%==01 set lastmm=12& set lastdd=31& goto LDoY ::Last Day of Year
if %yesterday:~4,2%==02 set lastmm=01& set lastdd=31
if %yesterday:~4,2%==03 set lastmm=02& goto february
if %yesterday:~4,2%==04 set lastmm=03& set lastdd=31
if %yesterday:~4,2%==05 set lastmm=04& set lastdd=30
if %yesterday:~4,2%==06 set lastmm=05& set lastdd=31
if %yesterday:~4,2%==07 set lastmm=06& set lastdd=30
if %yesterday:~4,2%==08 set lastmm=07& set lastdd=31
if %yesterday:~4,2%==09 set lastmm=08& set lastdd=31
if %yesterday:~4,2%==10 set lastmm=09& set lastdd=30
if %yesterday:~4,2%==11 set lastmm=10& set lastdd=31
if %yesterday:~4,2%==12 set lastmm=11& set lastdd=30
set yesterday=%lastyyyy%%lastmm%%lastdd%
goto endYesterday
:february
set leapyear=n
set lastdd=28
if %yesterday:~0,4%==2016 set leapyear=y
if %yesterday:~0,4%==2020 set leapyear=y
if %yesterday:~0,4%==2024 set leapyear=y
if %yesterday:~0,4%==2028 set leapyear=y
if %leapyear%==y set lastdd=29
set yesterday=%lastyyyy%%lastmm%%lastdd%
goto endYesterday
:LDoY
set /A yearCounter=%yearCounter%+1
set /A lastyyyy=%yyyy%-%yearCounter%
set yesterday=%lastyyyy%%lastmm%%lastdd%
:endYesterday
#echo off
echo %yyyy% %lastyyyy%
echo %mm% %lastmm%
echo %dd% %lastdd%
echo.
echo today = %yyyy%%mm%%dd%
echo yesterday = %yesterday%
Working with date and time using pure batch can be done, but it is not very convenient.
The GetTimestamp.bat utility makes date/time computations and formatting simple within a batch context. It is pure script (hybrid JScript/batch) that runs natively on any Windows machine from XP onward. The previous link points to the most recent version. The utility was first introduced with a number of examples at http://www.dostips.com/forum/viewtopic.php?t=4847.
Full documentation is available from the command line via getTimestamp /?, or getTimestamp /?? for paged output.
With GetTimestamp, the solution can be as simple as:
#echo off
:: Get the current day of the week, with 0=Sunday, 6=Saturday
:: to be used as an offset from today to get the most recent Sunday
call getTimeStamp -f {w} -r offset
:: Use the offset to get the most recent Sunday in YYYY-MM-DD format
call getTimeStamp -od -%offset% -f {iso-dt} -r lastSunday
:: Show the result
echo lastSunday=%lastSunday%
Try the following from a batch file:
for /f "usebackq" %%d in (`powershell -noprofile -command "'{0:yyyy-MM-dd}' -f [DateTime]::Now.AddDays(-1 * [DateTime]::Now.DayOfWeek)"`) do set "lastSunday=%%d"
echo %lastSunday%
:: -> e.g., "2016-02-21", when run on 2016-02-25
To try this directly on the command prompt, replace %%d with %d.
The PowerShell expression at the heart of the command,
[DateTime]::Now.AddDays(-1 * [DateTime]::Now.DayOfWeek),
which calculates the date of the most recent Sunday, was gratefully borrowed from the answer that you link to in your question.
'{0:yyyy-MM-dd}' -f ... applies the desired yyyy-mm-dd formatting to the date.
powershell -noprofile command ... invokes the PowerShell expression and outputs its result to stdout.
for /f "usebackq" %%d in (`...`) do set lastSunday=%%d captures the output from the PowerShell command and assigns it to batch variable lastSunday.
While invoking PowerShell for just one command from a batch file will be slow, being able to calculate the desired date so conveniently probably outweighs performance concerns.

Batch Script For File Date/Time

I know there are similar questions but I have not been able to make any work. I need to check a particular file date and time against the current date and time.
So far I have
Set cdate=%date%
Set filename="c:\myfile"
If Not Exist %filename% GOTO CREATEFILE
For %%f In(%filename%) DoSet filedatetime=%%~tf
If %filedatetime:~0,-9%" == "%cdate% GOTO SHOFILE
My problem is that the cdate returned has the day of the week included in the date but the file date does not. Example cdate= Thur 1/01/2015. How can I get the cdate not to have the day of the week?
Thanks
For %%f In (%filename%) Do Set "filedatetime=%%~tf"
If "%filedatetime:~0,-9%"=="%cdate:~4%" GOTO SHOFILE
Note the required space after in and do
The set "var=value" syntax ensures that any trailing spaces on the batch line are not included in the value assigned to var.
if /i "%var%"=="value" performs a comparison on variables/values containing separators (eg spaces) The '/i' make the comparison case-insensitive if required.
Your cdate can be set like this:
SET cdate=%date:~4%
This has the following output:
echo %cdate%
01/01/2015

powershell get current date format being used by system

How can I use powershell to get the current system date format for example if I was reading a log file using powershell I would like to know if 2012-03-01 is in yyyy-mm-dd or yyyy-dd-mm.
This should give you the DateTime formats for the machine's current culture:
[cultureinfo]::CurrentCulture.DateTimeFormat