esd ---> iso script (Testing in progress)

Discussion forum for all Windows batch related topics.

Moderator: DosItHelp

Message
Author
Squashman
Expert
Posts: 4484
Joined: 23 Dec 2011 13:59

Re: esd ---> iso script (Work in Progress)

#16 Post by Squashman » 07 Sep 2016 13:08

Was thinking we could use LOGMAN for some dirty time validation but looks like that is going to be language dependent.

You will probably have to write your own function to validate the time.

balubeto
Posts: 136
Joined: 08 Dec 2011 12:14

Re: esd ---> iso script (Work in Progress)

#17 Post by balubeto » 08 Sep 2016 02:37

Squashman wrote:
balubeto wrote:Since the -t option of the Oscdimg command https://msdn.microsoft.com/en-us/library/hh824847.aspx is independent of the operating system language used, the string entered by the user should always be compatible with the format mm/dd/yyyy,hh:mm:ss. Therefore, the script should test this and that this string has a logical sense. Right?

Did you perhaps attempt to figure out how to code this or even at least Google Search for a batch file that already does date and time validation?

Date Validation
http://stackoverflow.com/a/20415739/1417694


I also have to check the validity time separate from the sign of the comma.

So, how do I unify the validity of the date and time in the format mm/dd/yyyy,hh:mm:ss ?

Thanks

Bye

penpen
Expert
Posts: 2009
Joined: 23 Jun 2013 06:15
Location: Germany

Re: esd ---> iso script (Work in Progress)

#18 Post by penpen » 08 Sep 2016 10:39

balubeto wrote:A moment :

Since the -t option of the Oscdimg command https://msdn.microsoft.com/en-us/library/hh824847.aspx is independent of the operating system language used, the string entered by the user should always be compatible with the format mm/dd/yyyy,hh:mm:ss. Therefore, the script should test this and that this string has a logical sense. Right?
You are right - somehow i misread your post above :oops: .

Here is a dirty trick to validate a date.
Neat trick!

I use it in this timestamp validation:

Code: Select all

@echo off
setlocal enableExtensions enableDelayedExpansion
call :readValidTimestamp "timestamp"
set timestamp
endlocal
goto :eof


:readValidTimestamp
:: Caution!
:: This function creates two subdirectories "dummy\empty".
:: Don't use these directories!
:: These directories were deleted automatically.
:: %~1   environment variable to store the timestamp to
   if "%~1" == "" echo missing parameter & exit /b 1
   setlocal enableExtensions enableDelayedExpansion
   if not exist "dummy\empty" md "dummy\empty"
   set "ts="
   set /P "ts=Please Enter a valid timestamp ("mm/dd/yyyy,hh:mm:ss"): "
   (
      set ts
   ) | (
      >nul findstr /R /C:"^ts=../../....,[0-1][0-9]:[0-5][0-9]:[0-5][0-9]$" /C:"^ts=../../....,2[0-3]:[0-5][0-9]:[0-5][0-9]$"
   ) && (
      xcopy /d:!ts:~0,10! /t "dummy\empty" "dummy"
   ) && (
      rd /s /q dummy
      endlocal & set "%~1=%ts%"
      exit /b 0
   )
   echo Invalid timestamp: !ts!.
   endlocal
   goto :readValidTimestamp


balubeto wrote:Regarding the second problem, I wrote here https://social.technet.microsoft.com/Fo ... itprosetup .
I'm unsure how to interpret the answer you got there... .
(
It somehow reminds me to the german version of the "Win95-F1-help": Short, easy to read, correct and totally useless -
but actually i'm in bed with flu, so maybe i just miss the point.
Maybe testing the valid characters (see above how) would be faster.
)


penpen

balubeto
Posts: 136
Joined: 08 Dec 2011 12:14

Re: esd ---> iso script (Work in Progress)

#19 Post by balubeto » 09 Sep 2016 01:11

penpen wrote:
balubeto wrote:A moment :

Since the -t option of the Oscdimg command https://msdn.microsoft.com/en-us/library/hh824847.aspx is independent of the operating system language used, the string entered by the user should always be compatible with the format mm/dd/yyyy,hh:mm:ss. Therefore, the script should test this and that this string has a logical sense. Right?
You are right - somehow i misread your post above :oops: .

Here is a dirty trick to validate a date.
Neat trick!

I use it in this timestamp validation:

Code: Select all

@echo off
setlocal enableExtensions enableDelayedExpansion
call :readValidTimestamp "timestamp"
set timestamp
endlocal
goto :eof


:readValidTimestamp
:: Caution!
:: This function creates two subdirectories "dummy\empty".
:: Don't use these directories!
:: These directories were deleted automatically.
:: %~1   environment variable to store the timestamp to
   if "%~1" == "" echo missing parameter & exit /b 1
   setlocal enableExtensions enableDelayedExpansion
   if not exist "dummy\empty" md "dummy\empty"
   set "ts="
   set /P "ts=Please Enter a valid timestamp ("mm/dd/yyyy,hh:mm:ss"): "
   (
      set ts
   ) | (
      >nul findstr /R /C:"^ts=../../....,[0-1][0-9]:[0-5][0-9]:[0-5][0-9]$" /C:"^ts=../../....,2[0-3]:[0-5][0-9]:[0-5][0-9]$"
   ) && (
      xcopy /d:!ts:~0,10! /t "dummy\empty" "dummy"
   ) && (
      rd /s /q dummy
      endlocal & set "%~1=%ts%"
      exit /b 0
   )
   echo Invalid timestamp: !ts!.
   endlocal
   goto :readValidTimestamp


balubeto wrote:Regarding the second problem, I wrote here https://social.technet.microsoft.com/Fo ... itprosetup .
I'm unsure how to interpret the answer you got there... .
(
It somehow reminds me to the german version of the "Win95-F1-help": Short, easy to read, correct and totally useless -
but actually i'm in bed with flu, so maybe i just miss the point.
Maybe testing the valid characters (see above how) would be faster.
)


penpen


I inserted your routine in the main script

Code: Select all

@echo off
setlocal enableExtensions disableDelayedExpansion

call :setValidPath "Windows_Files_Path" "%~1" "Enter the directory in which put the content of the ""Windows Setup Media"" volume image:" "absolutePath" "mayExist"   "directory"  "rw"
call :setValidPath "iso_Path"           "%~2" "Enter the directory in which put the iso image file created:"                              "absolutePath" "mayExist"   "directory"  "--"
call :setValidPath "esd_Path"           "%~3" "Enter the directory in which put the esd unencrypted file:"                                "absolutePath" "mustExist"  "directory"  "--"
call :setValidPath "esd_File"           "%~4" "Enter the file to be converted which should be put in the %esd_Path% directory:"           "relativePath" "mustExist"  "file"       "rw" "esd_Path"
set "iso_File=%~5"
:set_iso_File
call :setValidPath "iso_File"           "%iso_File%" "Enter the iso file that will be saved in the %iso_Path% directory:"                        "relativePath" "mayExist"   "file"       "-w" "iso_Path"
call
if exist "%iso_Path%\%iso_File%" choice /M "Iso File exists; overwrite it " /C:YN
if not "%errorlevel%" == "1" set "iso_File=" & goto :set_iso_File
call :ValidTimestamp "timestamp"        "%~6" "Enter a timestamp ("mm/dd/yyyy,hh:mm:ss") for all files and directories in the %iso_File%:"





echo(
echo Result:
echo Windows_Files_Path: "%Windows_Files_Path%"
echo iso_Path          : "%iso_Path%"
echo esd_Path          : "%esd_Path%"
echo esd_File          : "%esd_File%"
echo iso_File          : "%iso_File%"
echo timestamp         : "%timestamp%"

:: put your code here

endlocal
goto :eof


:setValidPath
:: %~1   variable to set
:: %~2   default value
:: %~3   text if default value is invalid
:: %~4   Text equals: (forced to relativePath if %~6 equals file)
::     absolutePath  if path must be absolute
::     relativePath  if path must be relative
::     anyPath       if path may be relative or absolute (any other value)
:: %~5   Text equals: (forced to mayExist if %~8 does not exist)
::     mustExist     if file/directory must exist,
::     doesntExist   if file/directory is not allowed to exist.
::     mayExist      if file/directory may or may not exist (any other value).
:: %~6   Text equals:
::     file          if object to test is a file
::     directory     if object to test is a directory (any other value).
:: %~7   Text equals: (only checked if file/directory exists)
::     r             check read access for specified file/directory
::     w             check write access for specified file/directory
::     rw            check read and write access for specified file/directory
::     -             check no access for specified file/directory (any other value)
::     directory     if object to test is a directory (any other value).
::     Note: testing write access on a directory creates a file "test.tmp"
:: %~8   Only if /I %~6 == "file": environment variable with an path to store the file to
::   (forced to empty word, if %~6 equals directory).
::
 
   setlocal
   set "firstTime=1"
   set "input=%~2"
   set "text=%~3"
   if        "%~4" == "absolutePath" ( set "pathType=%~4"
   ) else if "%~4" == "relativePath" ( set "pathType=%~4"
   ) else set "existType=anyPath"
   if        "%~5" == "mustExist" ( set "existType=%~5"
   ) else if "%~5" == "doesntExist" ( set "existType=%~5"
   ) else set "existType=mayExist"
   setlocal enableDelayedExpansion
   set "parent= "
   if "%~6" == "file" (
      set "parent= !%~8!"
      if not "!parent:~-1!" == ":" (
         set "parent=!parent!\"
         if "!parent:~-2!" == "\\" set "parent=!parent:~0,-1!"
      )
   )
   endlocal & set "parent=%parent:~1%"
   if "%~6" == "file" (
      set "fileType=file"
      set "pathType=relativePath"
      if defined parent (
         if not exist "%parent%" set "existType=mayExist"
      ) else set "existType=mayExist"
   ) else set "fileType=directory"
   if        "%~7" == "r"  ( set "checkAccess=r-"
   ) else if "%~7" == "w"  ( set "checkAccess=-w"
   ) else if "%~7" == "rw" ( set "checkAccess=rw"
   ) else                  ( set "checkAccess=--"
   )

:validatePath
   :: validating
   set "invalid="
   call :isValidPathName "input" || goto :invalidatedPath
   if        /I     "%pathType%" == "absolutePath" ( call :isAbsolutePathName "input" || ( set "invalid=Path must be absolute" & goto :invalidatedPath )
   ) else if /I     "%pathType%" == "relativePath" ( call :isAbsolutePathName "input" && ( set "invalid=Path must be relative" & goto :invalidatedPath ) || >&2 >nul (echo @maybe: replace "<volume label>:" in !input!)
   )
   setlocal enableExtensions enableDelayedExpansion
   set "input=!parent!!input!"
   if        /I     "%existType%" == "mustExist"   ( if not exist "!input!" ( endlocal & set "invalid=Path must exist." & goto :invalidatedPath           )
   ) else if /I     "%existType%" == "doesntExist" ( if     exist "!input!" ( endlocal & set "invalid=Path must be non existent." & goto :invalidatedPath )
   )

   if exist "!input!" for %%b in ("!input!") do (
      set "attribs=%%~ab"
      if /I "%fileType%" == "file" (
         if not "!attribs:d=!" == "!attribs!" (
            endlocal & set "invalid=Path must denote a file (not a directory)." & goto :invalidatedPath
         ) else (
            if "%checkAccess:~0,1%" == "r" (
               2>nul <"!input!" set /p "check=" || (
                  for %%a in ("!input!") do if "%%~za" == "0" (
                     >&2 echo(Warning: Could not verify read access: Reason filesize of "!input!" is 0.
                  ) else (
                     endlocal & set "invalid=No read access (wanted)." & goto :invalidatedPath
                  )
               )
            ) else if "%checkAccess:~1,1%" == "w" 2>nul (
               >"!input!" <nul set /p "check=" || ( endlocal & set "invalid=No write access (wanted)." & goto :invalidatedPath )
            )
         )
      ) else (
         if "!attribs:d=!" == "!attribs!" (
            endlocal & set "invalid=Path must denote a directory (not a file)." & goto :invalidatedPath
         ) else (
            if "%checkAccess:~0,1%" == "r" 2>nul (
               >nul dir "!input!" || ( endlocal & set "invalid=No read access (wanted)." & goto :invalidatedPath )
            )
            if "%checkAccess:~1,1%" == "w" 2>nul (
               >nul pushd "!input!"
               >"test.tmp" echo test || ( >nul popd & endlocal & set "invalid=No write access (wanted)." & goto :invalidatedPath )
               >nul del "test.tmp"   || ( >nul popd & endlocal & set "invalid=No write access (wanted)." & goto :invalidatedPath )
               >nul popd
            )
         )
      )
   )

   endlocal
   endlocal & set "%~1=%input%"
   goto :eof

:invalidatedPath
   if defined invalid echo(Invalid: %invalid%
   set /P ^"input=%text:""="% "
   goto :validatePath
   goto :eof


:: Check if the pathname follows mainly the naming convention:
:: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx
:: Exceptions:
::  - Only a drive descriptor (for example "C:") is allowed for volume names.
::  - Not tested if characters 0x00-0x31, or any other forbidden character (of the target filesystem) are present. (disallowed)
::  - Not tested on alternative data streams
:isValidPathName
:: %~1   environment variable containing the path to test.
   setlocal enableExtensions enableDelayedExpansion
   set "pathName=!%~1!"
   set "invalid="
   if not defined invalid if "!pathName!" == "" if defined firstTime (exit /b 1 & goto :test) else set "invalid=The pathname cannot be empty." & set "pathName= "
   if not defined invalid for /f tokens^=1^*^ delims^=^/^<^>^|^*^?^" %%a in ("#!pathName!#") do if not "%%~b" == "" set "invalid=Invalid character found."
   if not defined invalid set ^"pathname=!pathname:"=!"

   if not defined invalid (
      set "pathName= !pathName:/=\!"
>nul echo @maybe:set "pathName= !pathName:\..\=\!"
>nul echo @maybe:set "pathName= !pathName:\.\=\!"
>nul echo @maybe:if "%pathName:~-3%" == "\.." set "pathName= !pathName:~0,-3!"
>nul echo @maybe:if "%pathName:~-2%" == "\." set "pathName= !pathName:~0,-2!"
   )

   if not defined invalid if not "!pathName:\\=__!" == "!pathname!" set "invalid=Empty string is no valid path component."
   if not defined invalid if "!pathName:~1,1!" == ":" (
      for /f "tokens=1* delims=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" %%a in ("#!pathName:~0,1!#") do if not "%%~a" == "#" set "invalid=Invalid drive name."
      set "pathName=!pathName:~2!"
   )
   if not defined invalid 2>nul (
      echo(\!pathname!\|>nul findstr /I /R /C:"[\\]AUX[\\]" /C:"[\\]CON[\\]" /C:"[\\]NUL[\\]" /C:"[\\]PRN[\\]" /C:"[\\]COM[0-9][\\]" /C:"[\\]LPT[0-9][\\]" && (
         set "invalid=The following names are not allowed for file/directory names: CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9."
      )
   )
   if not defined invalid 2>nul (
      echo(\!pathname!\|>nul findstr /R /C:"[\ ][\\]" /C:"[\.][\\]" && (
         set "invalid=It is not allowed to end file/directory names with a space (' ') or a period ('.') character."
      )
   )
   if not defined invalid (
      endlocal
      exit /b 0
   ) else (
      endlocal & set "invalid=%invalid%"
      exit /b 1
   )
   goto :eof


:: Using mainly the definition of the Windows Shell API, see:
:: https://msdn.microsoft.com/en-us/library/windows/desktop/bb773660(v=vs.85).aspx
:: Exception:
::  - Only accepts a drive descriptor (for example "C:") is allowed for volume names.
::
:: does not check validity (must be valid)
:isAbsolutePathName
:: %~1   environment variable containing the path to test.
   setlocal enableExtensions enableDelayedExpansion
   if not "!%~1:~1,2!" == ":\" (
      endlocal
      exit /b 1
   ) else (
      endlocal
      exit /b 0
   )
   goto :eof

:ValidTimestamp
:: Caution!
:: This function creates two subdirectories "dummy\empty".
:: Don't use these directories!
:: These directories were deleted automatically.
:: %~1   environment variable to store the timestamp to
   if "%~1" == "" echo missing parameter & exit /b 1
   setlocal enableExtensions enableDelayedExpansion
   if not exist "dummy\empty" md "dummy\empty"
   (
            set "ts=%~2"
   ) | (
      >nul findstr /R /C:"^ts=../../....,[0-1][0-9]:[0-5][0-9]:[0-5][0-9]$" /C:"^ts=../../....,2[0-3]:[0-5][0-9]:[0-5][0-9]$"
   ) && (
      xcopy /d:!ts:~0,10! /t "dummy\empty" "dummy"
   ) && (
      rd /s /q dummy
      endlocal & set "%~2=%ts%"
      exit /b 0
   )
   echo Invalid timestamp: !ts!.
   endlocal
   goto :ValidTimestamp


but it does not work. Where did I go wrong?

Thanks

Bye

Squashman
Expert
Posts: 4484
Joined: 23 Dec 2011 13:59

Re: esd ---> iso script (Work in Progress)

#20 Post by Squashman » 09 Sep 2016 07:18

balubeto wrote:but it does not work. Where did I go wrong?

Thanks

Bye

You changed the CODE! It says right in the instructions how the value is assigned to a variable yet you decided to change it for some reason! You also kept the GOTO label in the code but removed the prompting to enter in a new time stamp.

balubeto
Posts: 136
Joined: 08 Dec 2011 12:14

Re: esd ---> iso script (Work in Progress)

#21 Post by balubeto » 09 Sep 2016 09:16

Squashman wrote:
balubeto wrote:but it does not work. Where did I go wrong?

Thanks

Bye

You changed the CODE! It says right in the instructions how the value is assigned to a variable yet you decided to change it for some reason! You also kept the GOTO label in the code but removed the prompting to enter in a new time stamp.


I can not understand if this line:

Code: Select all

call :ValidTimestamp "timestamp"        "%~6" "Enter a timestamp ("mm/dd/yyyy,hh:mm:ss") for all files and directories in the %iso_File%:"


is right?

If so, what should I change in the ValidTimestamp routine?

Thanks

Bye

Squashman
Expert
Posts: 4484
Joined: 23 Dec 2011 13:59

Re: esd ---> iso script (Work in Progress)

#22 Post by Squashman » 09 Sep 2016 09:30

balubeto wrote:
Squashman wrote:
balubeto wrote:but it does not work. Where did I go wrong?

Thanks

Bye

You changed the CODE! It says right in the instructions how the value is assigned to a variable yet you decided to change it for some reason! You also kept the GOTO label in the code but removed the prompting to enter in a new time stamp.


I can not understand if this line:

Code: Select all

call :ValidTimestamp "timestamp"        "%~6" "Enter a timestamp ("mm/dd/yyyy,hh:mm:ss") for all files and directories in the %iso_File%:"



is right?

If so, what should I change in the ValidTimestamp routine?

Thanks

Bye

Answer this for me.
When you call the function, what is %1, and what is %2?
Then look at the function and tell me if you are using them correctly.

balubeto
Posts: 136
Joined: 08 Dec 2011 12:14

Re: esd ---> iso script (Work in Progress)

#23 Post by balubeto » 09 Sep 2016 09:53

Squashman wrote:
balubeto wrote:
Squashman wrote:You changed the CODE! It says right in the instructions how the value is assigned to a variable yet you decided to change it for some reason! You also kept the GOTO label in the code but removed the prompting to enter in a new time stamp.


I can not understand if this line:

Code: Select all

call :ValidTimestamp "timestamp"        "%~6" "Enter a timestamp ("mm/dd/yyyy,hh:mm:ss") for all files and directories in the %iso_File%:"



is right?

If so, what should I change in the ValidTimestamp routine?

Thanks

Bye

Answer this for me.
When you call the function, what is %1, and what is %2?
Then look at the function and tell me if you are using them correctly.


For me:

Code: Select all

%1="timestamp"
%2="%~6"
%3="Enter a timestamp ("mm/dd/yyyy,hh:mm:ss") for all files and directories in the %iso_File%:"


Right?

Thanks

Bye

Squashman
Expert
Posts: 4484
Joined: 23 Dec 2011 13:59

Re: esd ---> iso script (Work in Progress)

#24 Post by Squashman » 09 Sep 2016 10:44

balubeto wrote:For me:

Code: Select all

%1="timestamp"
%2="%~6"
%3="Enter a timestamp ("mm/dd/yyyy,hh:mm:ss") for all files and directories in the %iso_File%:"


Right?

Thanks

Bye

So are you using %1 and %2 correctly in the function?

penpen
Expert
Posts: 2009
Joined: 23 Jun 2013 06:15
Location: Germany

Re: esd ---> iso script (Work in Progress)

#25 Post by penpen » 09 Sep 2016 10:56

balubeto wrote:I inserted your routine in the main script

Code: Select all

: ...
call :ValidTimestamp "timestamp"        "%~6" "Enter a timestamp ("mm/dd/yyyy,hh:mm:ss") for all files and directories in the %iso_File%:"

: ...

:ValidTimestamp
:: Caution!
:: This function creates two subdirectories "dummy\empty".
:: Don't use these directories!
:: These directories were deleted automatically.
:: %~1   environment variable to store the timestamp to
   if "%~1" == "" echo missing parameter & exit /b 1
   setlocal enableExtensions enableDelayedExpansion
   if not exist "dummy\empty" md "dummy\empty"
   (
            set "ts=%~2"
   ) | (
      >nul findstr /R /C:"^ts=../../....,[0-1][0-9]:[0-5][0-9]:[0-5][0-9]$" /C:"^ts=../../....,2[0-3]:[0-5][0-9]:[0-5][0-9]$"
   ) && (
      xcopy /d:!ts:~0,10! /t "dummy\empty" "dummy"
   ) && (
      rd /s /q dummy
      endlocal & set "%~2=%ts%"
      exit /b 0
   )
   echo Invalid timestamp: !ts!.
   endlocal
   goto :ValidTimestamp


but it does not work. Where did I go wrong?
You made some slight errors (on a first look, but may be incomplete):
1) You wanted to use "Enter a timestamp ("mm/dd/yyyy,hh:mm:ss") for all files and directories in the %iso_File%:" as one parameter (including doublequotes).

This is not possible because the comma character (',') is a special character if it stands outside of doublequotes.
More specific it is a seperator, that divides parameters (so there are 4 parameter, and the comma character is removed).
You could replace the internal doublequotes by single quotes ('\'', "..Enter a timestamp ('mm/dd/yyyy,hh:mm:ss') for ...").

2) You've removed the "set /p" part in the source that reads in the user input.

3) You have replaced the "list environment variable" command (set "ts") by an "assign variable" command (set "ts= set "ts=%~2").
The second command has no output, so the validation using findstr must fail because it expects a string to work with
(if findstr finds a matching string, then this string is valid).
The matching pattern uses regular expressions:
- The dot ('.') matches any character,
- the tilde character ('^') matches line starts
- the dollar character ('$') matches line endings
- class matching ([a-b]) matches all characters (unicode) between 'a' and 'b' (including these borders).
(So [0-5] matches 0, 1, 2, 3, 4 and 5.)

Actually i'm not at home posting here using a mobile phone, so it will take a while until i am home.


penpen

balubeto
Posts: 136
Joined: 08 Dec 2011 12:14

Re: esd ---> iso script (Work in Progress)

#26 Post by balubeto » 09 Sep 2016 11:25

penpen wrote:
balubeto wrote:I inserted your routine in the main script

Code: Select all

: ...
call :ValidTimestamp "timestamp"        "%~6" "Enter a timestamp ("mm/dd/yyyy,hh:mm:ss") for all files and directories in the %iso_File%:"

: ...

:ValidTimestamp
:: Caution!
:: This function creates two subdirectories "dummy\empty".
:: Don't use these directories!
:: These directories were deleted automatically.
:: %~1   environment variable to store the timestamp to
   if "%~1" == "" echo missing parameter & exit /b 1
   setlocal enableExtensions enableDelayedExpansion
   if not exist "dummy\empty" md "dummy\empty"
   (
            set "ts=%~2"
   ) | (
      >nul findstr /R /C:"^ts=../../....,[0-1][0-9]:[0-5][0-9]:[0-5][0-9]$" /C:"^ts=../../....,2[0-3]:[0-5][0-9]:[0-5][0-9]$"
   ) && (
      xcopy /d:!ts:~0,10! /t "dummy\empty" "dummy"
   ) && (
      rd /s /q dummy
      endlocal & set "%~2=%ts%"
      exit /b 0
   )
   echo Invalid timestamp: !ts!.
   endlocal
   goto :ValidTimestamp


but it does not work. Where did I go wrong?
You made some slight errors (on a first look, but may be incomplete):
1) You wanted to use "Enter a timestamp ("mm/dd/yyyy,hh:mm:ss") for all files and directories in the %iso_File%:" as one parameter (including doublequotes).

This is not possible because the comma character (',') is a special character if it stands outside of doublequotes.
More specific it is a seperator, that divides parameters (so there are 4 parameter, and the comma character is removed).
You could replace the internal doublequotes by single quotes ('\'', "..Enter a timestamp ('mm/dd/yyyy,hh:mm:ss') for ...").

2) You've removed the "set /p" part in the source that reads in the user input.

3) You have replaced the "list environment variable" command (set "ts") by an "assign variable" command (set "ts= set "ts=%~2").
The second command has no output, so the validation using findstr must fail because it expects a string to work with
(if findstr finds a matching string, then this string is valid).
The matching pattern uses regular expressions:
- The dot ('.') matches any character,
- the tilde character ('^') matches line starts
- the dollar character ('$') matches line endings
- class matching ([a-b]) matches all characters (unicode) between 'a' and 'b' (including these borders).
(So [0-5] matches 0, 1, 2, 3, 4 and 5.)

Actually i'm not at home posting here using a mobile phone, so it will take a while until i am home.


penpen


Code: Select all

: ...
call :ValidTimestamp "timestamp"        "%~6" "Enter a timestamp (""mm/dd/yyyy\,hh:mm:ss"") for all files and directories in the %iso_File%:"

: ...

:ValidTimestamp
:: Caution!
:: This function creates two subdirectories "dummy\empty".
:: Don't use these directories!
:: These directories were deleted automatically.
:: %~1   environment variable to store the timestamp to
   if "%~1" == "" echo missing parameter & exit /b 1
   setlocal enableExtensions enableDelayedExpansion
   if not exist "dummy\empty" md "dummy\empty"
        set "ts="
   (
        set "ts=%~2"
   ) | (
      >nul findstr /R /C:"^ts=../../....,[0-1][0-9]:[0-5][0-9]:[0-5][0-9]$" /C:"^ts=../../....,2[0-3]:[0-5][0-9]:[0-5][0-9]$"
   ) && (
      xcopy /d:!ts:~0,10! /t "dummy\empty" "dummy"
   ) && (
      rd /s /q dummy
      endlocal & set "%~2=%ts%"
      exit /b 0
   )
   echo Invalid timestamp: !ts!.
   endlocal
   goto :ValidTimestamp


I made the appropriate corrections or not?

Thanks

Bye

Squashman
Expert
Posts: 4484
Joined: 23 Dec 2011 13:59

Re: esd ---> iso script (Work in Progress)

#27 Post by Squashman » 09 Sep 2016 11:59

balubeto wrote:I made the appropriate corrections or not?

Thanks

Bye

You seem to think you do not need to use %1 in the function. Why?
Look back at the original code Penpen provided. Where is %1 being used that you are not using it?

Squashman
Expert
Posts: 4484
Joined: 23 Dec 2011 13:59

Re: esd ---> iso script (Work in Progress)

#28 Post by Squashman » 09 Sep 2016 12:28

Code: Select all

: ...
call :ValidTimestamp "timestamp"        "%~6" "Enter a timestamp (""mm/dd/yyyy\,hh:mm:ss"") for all files and directories in the %iso_File%:"

: ...

:ValidTimestamp
:: Caution!
:: This function creates two subdirectories "dummy\empty".
:: Don't use these directories!
:: These directories were deleted automatically.
:: %~1   environment variable to store the timestamp to
   if "%~1" == "" echo missing parameter & exit /b 1
   if "%~2" == "" echo missing parameter & exit /b 1
   setlocal enableExtensions enableDelayedExpansion
   if not exist "dummy\empty" md "dummy\empty"
        set "ts=%~2"
   (
        set ts
   ) | (
      >nul findstr /R /C:"^ts=../../....,[0-1][0-9]:[0-5][0-9]:[0-5][0-9]$" /C:"^ts=../../....,2[0-3]:[0-5][0-9]:[0-5][0-9]$"
   ) && (
      xcopy /d:!ts:~0,10! /t "dummy\empty" "dummy"
   ) && (
      rd /s /q dummy
      endlocal & set "%~1=%ts%"
      exit /b 0
   )
   echo Invalid timestamp: !ts!.
   endlocal

balubeto
Posts: 136
Joined: 08 Dec 2011 12:14

Re: esd ---> iso script (Work in Progress)

#29 Post by balubeto » 10 Sep 2016 04:08

Squashman wrote:

Code: Select all

: ...
call :ValidTimestamp "timestamp"        "%~6" "Enter a timestamp (""mm/dd/yyyy\,hh:mm:ss"") for all files and directories in the %iso_File%:"

: ...

:ValidTimestamp
:: Caution!
:: This function creates two subdirectories "dummy\empty".
:: Don't use these directories!
:: These directories were deleted automatically.
:: %~1   environment variable to store the timestamp to
   if "%~1" == "" echo missing parameter & exit /b 1
   if "%~2" == "" echo missing parameter & exit /b 1
   setlocal enableExtensions enableDelayedExpansion
   if not exist "dummy\empty" md "dummy\empty"
        set "ts=%~2"
   (
        set ts
   ) | (
      >nul findstr /R /C:"^ts=../../....,[0-1][0-9]:[0-5][0-9]:[0-5][0-9]$" /C:"^ts=../../....,2[0-3]:[0-5][0-9]:[0-5][0-9]$"
   ) && (
      xcopy /d:!ts:~0,10! /t "dummy\empty" "dummy"
   ) && (
      rd /s /q dummy
      endlocal & set "%~1=%ts%"
      exit /b 0
   )
   echo Invalid timestamp: !ts!.
   endlocal


I noticed that, when I write a timestamp in a different format, the routine does not ask me to type it again.

Moreover, it does not consider the leap years.

So, how do I solve these problems?

Thanks

Bye

penpen
Expert
Posts: 2009
Joined: 23 Jun 2013 06:15
Location: Germany

Re: esd ---> iso script (Work in Progress)

#30 Post by penpen » 10 Sep 2016 11:29

balubeto wrote:I noticed that, when I write a timestamp in a different format, the routine does not ask me to type it again.
This might help you:

Code: Select all

@echo off
setlocal enableExtensions disableDelayedExpansion
call :ValidTimestamp "timestamp"        "%~1" "Enter a timestamp ('mm/dd/yyyy,hh:mm:ss') for all files and directories in the %iso_File%:"
set timestamp

endlocal
goto :eof

:ValidTimestamp
:: Caution!
:: This function creates two subdirectories "dummy\empty".
:: Don't use these directories!
:: These directories were deleted automatically.
:: %~1   environment variable to store the timestamp to
:: %~2   predefined timestamp value to test
:: %~3   text that is displayed to ask for the timestamp value
   if "%~1" == "" echo missing parameter & exit /b 1
   if not exist "dummy\empty" md "dummy\empty"
   setlocal enableExtensions enableDelayedExpansion
   set "ts=%~2"
   if not defined ts set /P "ts=%~3"
   (
      set "ts"
   ) | (
      >nul findstr /R /C:"^ts=../../....,[0-1][0-9]:[0-5][0-9]:[0-5][0-9]$" /C:"^ts=../../....,2[0-3]:[0-5][0-9]:[0-5][0-9]$"
   ) && (
      xcopy /d:!ts:~0,10! /t "dummy\empty" "dummy"
   ) && (
      rd /s /q dummy
      endlocal & set "%~1=%ts%"
      exit /b 0
   )
   echo Invalid timestamp: !ts!.
   endlocal
   if not "%~2" == "" (
      call :ValidTimestamp "%~1" "" "%~3"
      exit /b
   )
   goto :ValidTimestamp


balubeto wrote:Moreover, it does not consider the leap years.
It should!
Which date does not work?


penpen

Post Reply