TOUCH a batch file from itself

0

I'd like a batch file to touch itself to an arbitrary date/time. I've tried...

touch.exe -xamq -t 201010201020 -- batch.cmd
start /b "" cmd.exe /c "touch.exe -xamq -t 201010201020 -- batch.cmd"

...and the funny thing is, when run in Windows (double-clicking) the date doesn't change and cmd.exe hangs for about a minute. When I run it in a cmd window it works just fine, with no hang. Any ideas what's going on?

Joel A

Posted 2015-05-10T02:26:19.980

Reputation: 1

Is the fact that the batch file actively executing locking it, preventing its attributes from changing? If so, you need a two-step process, where batch file A calls batch file B, passing in the name of A as a parameter and exiting before be touches file A. A delay in B might be needed. – DrMoishe Pippik – 2015-05-10T02:32:09.723

It's locked in my examples running from Windows, but not from the command line. Also, Calling from A to B will keep A open, because when B finishes there's a "return" to A. – Joel A – 2015-05-10T02:49:19.300

Answers

1

Quotes in wrong place. Plus needless indirection.

start /b "" cmd.exe /c "touch.exe -xamq -t 201010201020 -- batch.cmd"

So you are asking CMD to ask Explorer (Start command) to start CMD to run a program.

start /b "" cmd.exe /c "touch.exe" -xamq -t 201010201020 -- batch.cmd

Better

"touch.exe" -xamq -t 201010201020 -- batch.cmd

To do it in Windows (copy without a destination updates the file date and %~0 is the name of the bat)

set olddate=%date%
set oldtime=%time%
date 1/1/2010
time 5:15
copy "%~0",,
date %olddate%
time %oldtime%

Batchfiles are opened, the next line read, then closed for each line, and once to find out there are no more lines. Wierd stuff can happen if modifing a running bat.

&    seperates commands on a line.

&&    executes this command only if previous command's errorlevel is 0.

||    (not used above) executes this command only if previous command's errorlevel is NOT 0

>    output to a file

>>    append output to a file

<    input from a file

|    output of one command into the input of another command

^    escapes any of the above, including itself, if needed to be passed to a program

"    parameters with spaces must be enclosed in quotes

+ used with copy to concatinate files. E.G. copy file1+file2 newfile

, used with copy to indicate missing parameters. This updates the files modified date. E.G. copy /b file1,,

%variablename% a inbuilt or user set environmental variable

!variablename! a user set environmental variable expanded at execution time, turned with SelLocal EnableDelayedExpansion command

%<number> (%1) the nth command line parameter passed to a batch file. %0 is the batchfile's name.

%* (%*) the entire command line.

%<a letter> or %%<a letter> (%A or %%A) the variable in a for loop. Single % sign at command prompt and double % sign in a batch file.


\\ (\\servername\sharename\folder\file.ext) access files and folders via UNC naming.

: (win.ini:streamname) accesses an alternative steam. Also separates drive from rest of path.

. (win.ini) the LAST dot in a file path seperates the name from extension

. (dir .\*.txt) the current directory

.. (cd ..) the parent directory


\\?\ (\\?\c:\windows\win.ini) When a file path is prefixed with \\?\ filename checks are turned off. 

< > : " / \ | Reserved characters. May not be used in filenames.



Reserved names. These refer to devices eg, 

copy filename con 

which copies a file to the console window.

CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, 

COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, 

LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9



Maximum path length              260 characters
Maximum path length (\\?\)      32,767 characters (approx - some rare characters use 2 characters of storage)
Maximum filename length        255 characters

trigger

Posted 2015-05-10T02:26:19.980

Reputation: 11

Thanks Trigger for your input. You're right about the weird behavior, neither of your examples work when double-clicked in explorer, but both work perfectly in a cmd window. Sigh, Windows! – Joel A – 2015-05-11T13:43:04.407

You need to edit your question with more data. Also put logging in your batch echoing (echo %something%`) out asumptions. Specify the exact things (code, variables, folder structure). I'm snezzing - got to go. – trigger – 2015-05-11T13:51:58.880