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" "mustExist" "directory" "rw"
call :setValidPath "iso_Path" "%~2" "Enter the directory in which put the iso image file created:" "absolutePath" "mayExist" "directory" "--"
call :setValidPath "esd_File_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_File_Path% directory:" "relativePath" "mustExist" "file" "rw" "esd_File_Path"
echo(
echo Result:
echo Windows_Files_Path: "%Windows_Files_Path%"
echo iso_Path : "%iso_Path%"
echo esd_File_Path : "%esd_File_Path%"
echo esd_File : "%esd_File%"
:: 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 "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="
set "input=%parent%%input%"
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 )
)
setlocal enableExtensions enableDelayedExpansion
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=" || ( 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
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!" == "" set "invalid=The pathname cannot be empty."
if not defined invalid for /f tokens^=1^*^ delims^=^/^<^>^|^*^?^" %%a in ("#!pathName!#") do if not "%%~b" == "" set "invalid=Invalid character found."
if defined invalid set ^"pathname=!pathname:"=!"
if not defined invalid (
set "pathName= !pathName:/=\!"
set "pathName= !pathName:\..\=\!"
set "pathName= !pathName:\.\=\!"
if "%pathName:~-3%" == "\.." set "pathName= !pathName:~0,-3!"
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
this error appears:
Code: Select all
D:\Users\Public\Documents\Balubeto\Test_script>Test_01.bat
=" == "\.." set "pathName= non atteso.
D:\Users\Public\Documents\Balubeto\Test_script>
Why?
Thanks
Bye