windows - Lote Trata los caracteres especiales como errores de entrada

CorePress2024-01-25  11

Quiero que todos los caracteres no numéricos se consideren errores de entrada. Los caracteres alfabéticos están bien considerados, pero no ciertos caracteres especiales como los dos puntos (y otros).

¿Alguna idea de cómo lograrlo?

@echo off

setlocal EnableDelayedExpansion

set /a UserProfileNo=0

FOR /F "delims=" %%I IN ('dir /a:d /b "%SystemDrive%\Users\"') do (

    set "UserProfileName=%%~I"
    set /a UserProfileNo+=1
    set "UserProfileName[!UserProfileNo!]=!UserProfileName!"

)

FOR /L %%k IN (1, 1, %UserProfileNo%) DO echo  %%~k !UserProfileName[%%~k]!
    set /p choice=Enter a Profile Number: 

FOR %%f IN (%choice%) DO if "!UserProfileName[%%~f]!" == "" (
    echo Error in the input
    goto end
    )

echo NO Error in the input

:end

pause

exit

Gracias



------------------------------------

Ofrecería una ampliación del código que le proporcioné antes para realizar esta tarea.

El siguiente código enumerará todos los usuarios locales estándar y le permitirá elegir uno de la lista, por su índice numérico. Sólo se aceptarán números de índice válidos (no otros caracteres normales), incluidos !, ", %, ^, &, ), =, |, < y >

Al utilizar este método, no se limita la salida solo a los perfiles de usuario ubicados en la ruta codificada %SystemDrive%\Users, ni depende del nombre del directorio para el perfil que coincide con el nombre del titular de la cuenta (si un usuario cambia su nombre de cuenta, su directorio de perfil no cambia de nombre para reflejar ese cambio).

@Echo Off&SetLocal EnableExtensions DisableDelayedExpansion
Set "i=0"&For /F "Delims==" %%G In ('"(Set User[) 2>NUL"')Do Set "%%G="
For /F "Delims==" %%G In ('%__AppDir__%wbem\WMIC.exe OS Call /?
 ^| %__AppDir__%find.exe "=="') Do Set "#=%%G"
For /F Tokens^=4Delims^=^" %%G In ('%__AppDir__%wbem\WMIC.exe UserAccount Where
 "LocalAccount='TRUE'" Assoc:List /ResultRole:SID 2^>NUL'
)Do For /F Tokens^=1* %%H In ('%__AppDir__%wbem\WMIC.exe UserAccount Where
 "Name='%%G'" Get SID /Value 2^>NUL^|%__AppDir__%find.exe "="'
)Do For %%I In (%%H)Do For /F "Tokens=1*Delims==" %%J In ( 
 '%__AppDir__%wbem\WMIC.exe Path Win32_UserProfile Where
 "SID='%%I' And Special!='TRUE' And LocalPath Is Not Null" Get LocalPath /Value
 2^>NUL^|%__AppDir__%find.exe "="')Do For /F "Tokens=*" %%L In ("%%K")Do (
    Set /A i+=1&SetLocal EnableDelayedExpansion&Echo !i!.%#:~-1%%%G
    For %%M In (!i!)Do EndLocal&Set "User[%%M]Name=%%G"&Set "User[%%M]Path=%%L")
If Not Defined User[1]Name (Echo No standard users found, Press a key to end.
    GoTo :EOF)

:Pick
Echo(&Set "#="
Set /P "#=Enter the number for your chosen Account Name>"
Set "#=%#:"=%"
(Set User[)|%__AppDir__%findstr.exe /BL "User[%#%]Name=">NUL||GoTo Pick
SetLocal EnableDelayedExpansion&For /F UseBackTokens^=1^,3Delims^=^" %%G In (
    '"!User[%#%]Name!" "!User[%#%]Path!"')Do (EndLocal&Set "User[Name]=%%G"
    Set "User[Profile]=%%H"&Set "#=")
(For /L %%G In (1,1,%i%)Do For %%H In (Name Path)Do Set User[%%G]%%H=)&Set "i="
Echo(&Echo You Selected %User[Name]% - [profile location is %User[Profile]%]
%__AppDir__%timeout.exe /T 5 /NoBreak>NUL

Las dos últimas líneas son solo para fines de demostración; las reemplazará con su propio código, solo después de realizar la prueba. Su inclusión fue para demostrar que una entrada de entrada válida creará dos nuevas variables locales, %User[Name]%, (el %UserName% para el número de índice de entrada) y %User[Profile]%, (el %UserProfile% para el número de índice de entrada).

Tenga en cuenta: el código anterior solo debe ejecutarse y probarse exactamente como existe arriba, sin omisiones, ademásns, o modificaciones. Si no funciona según lo previsto, aceptaré cambiar todas las instancias de %__AppDir__% con %SystemRoot%\System32\, antes de solicitar asistencia.



------------------------------------

Puedes usar findtr regex para restringir caracteres:

@Echo off
call :input rv[1] 0123456789 "enter a number"
call :input rv[2] a-zA-Z "enter a alphanumerical string"
call :input rv[3] "a-zA-Z " "enter an alpha sentence"
set rv[
Goto :Eof

:input [ReturnVar] [CharacterString] [prompt]
 Setlocal EnableExtensions EnableDelayedExpansion
:retry
 Set "input="
 Set /P "input=%~3: "
 If  "!input!" == "" Goto :retry
 Echo("!input!"| %__APPDIR__%findstr.exe /RXC:"[\"][%~2]*[\"]" >nul || Goto :retry
 Endlocal & Set "%~1=%input%"
 Exit /B 0

4

Gracias. ¡Lamentablemente, su código no excluye los caracteres! y ;

-A. josón

30/03/2021 a las 18:53

@A.Joson esos dos problemas se solucionan fácilmente.

- Squashman

30/03/2021 a las 20:47

Se modificó el código de @A.Jason para eliminar esos caracteres mediante la modificación de la subcadena. Alternativa Findstr agregada a la respuesta

- T3RR0R

31 de marzo de 2021 a las 3:28

Lamentablemente, su último código no excluye los caracteres ^ y &

-A. josón

31 de marzo de 2021 a las 16:33

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare