¿Cómo eliminar espacios en blanco finales y adelantados para la entrada proporcionada por el usuario en un archivo por lotes?

Sé cómo hacer esto cuando la variable está predefinida. Sin embargo, al solicitar al usuario que ingrese algún tipo de entrada, ¿cómo recorto el espacio en blanco inicial y final? Esto es lo que tengo hasta ahora:

@echo off set /p input=: echo. The input is %input% before ::trim left whitespace for /f "tokens=* delims= " %%a in ("%input%") do set input=%%a ::trim right whitespace (up to 100 spaces at the end) for /l %%a in (1,1,100) do if "!input:~-1!"==" " set input=!input:~0,-1! echo. The input is %input% after pause 

    Debe habilitar la expansión retrasada. Prueba esto:

     @echo off setlocal enabledelayedexpansion :blah set /p input=: echo."%input%" for /f "tokens=* delims= " %%a in ("%input%") do set input=%%a for /l %%a in (1,1,100) do if "!input:~-1!"==" " set input=!input:~0,-1! echo."%input%" pause goto blah 

    La solución a continuación funciona muy bien para mí.

    Solo 4 líneas y funciona con la mayoría de los caracteres (¿todos?) .


    Solución:

     :Trim SetLocal EnableDelayedExpansion set Params=%* for /f "tokens=1*" %%a in ("!Params!") do EndLocal & set %1=%%b exit /b 

    Prueba:

     @echo off call :Test1 & call :Test2 & call :Test3 & exit /b :Trim SetLocal EnableDelayedExpansion set Params=%* for /f "tokens=1*" %%a in ("!Params!") do EndLocal & set %1=%%b exit /b :Test1 set Value= abc set Expected=abc call :Trim Actual %Value% if "%Expected%" == "%Actual%" (echo Test1 passed) else (echo Test1 failed) exit /b :Test2 SetLocal EnableDelayedExpansion set Value= a \ / : * ? " ' <> | ` ~ @ # $ [ ] & ( ) + - _ = z set Expected=a \ / : * ? " ' <> | ` ~ @ # $ [ ] & ( ) + - _ = z call :Trim Actual !Value! if !Expected! == !Actual! (echo Test2 passed) else (echo Test2 failed) exit /b :Test3 set /p Value="Enter string to trim: " %=% echo Before: [%Value%] call :Trim Value %Value% echo After : [%Value%] 

    Una solución muy corta y fácil que estoy usando es esta:

     @ECHO OFF SET /p NAME=- NAME ? ECHO "%NAME%" CALL :TRIM %NAME% NAME ECHO "%NAME%" PAUSE :TRIM SET %2=%1 GOTO :EOF 

    Resultados en:

     - NAME ? my_name " my_name " "my_name" 

    Me gustaría presentar una solución compacta utilizando una llamada de referencia (sí, “lote” también tiene punteros) para una función y una “subfunción”:

      @ECHO OFF SETLOCAL ENABLEDELAYEDEXPANSION SET /p NAME=- NAME ? ECHO "%NAME%" CALL :TRIM NAME ECHO "%NAME%" GOTO :EOF :TRIM SetLocal EnableDelayedExpansion Call :TRIMSUB %%%1%% EndLocal & set %1=%tempvar% GOTO :EOF :TRIMSUB set tempvar=%* GOTO :EOF 

    Para mejorar la respuesta de Forumpie, el truco es usar %* (todos los params) en el sub:

    Editar: se agregó el eco de los parámetros de subrutinas TRIM para proporcionar más información

     @ECHO OFF SET /p NAME=- NAME ? ECHO "%NAME%" CALL :TRIM %NAME% SET NAME=%TRIMRESULT% ECHO "%NAME%" GOTO :EOF :TRIM echo "%1" echo "%2" echo "%3" echo "%4" SET TRIMRESULT=%* GOTO :EOF 

    Esto elimina los espacios iniciales y finales, pero mantiene todos los espacios intermedios.

     " 1 2 3 4 " "1 2 3 4" 

    Detalles de% *: Parámetros del lote

      @echo off & setlocal enableextensions rem enabledelayedexpansion set S= This is a test echo %S%. for /f "tokens=* delims= " %%a in ('echo %S%') do set S=%%a echo %S%. endlocal & goto :EOF 

    de http://www.netikka.net/tsneti/info/tscmd079.htm

    para eliminar espacios principales

    Lo hice así (activando temporalmente la expansión retardada):

      ... sqlcmd -b -S %COMPUTERNAME% -E -d %DBNAME% -Q "SELECT label from document WHERE label = '%DOCID%';" -h-1 -o Result.txt if errorlevel 1 goto INVALID :: Read SQL result and trim trailing whitespace SET /P ITEM= 
     @echo off setlocal EnableDelayedExpansion set S= This is a test echo %S%. for /f "tokens=* delims= " %%a in ('echo %S%') do (set b=%%a & set b=!b: =! & echo !b!) endlocal & goto :EOF 

    o

     @echo off setlocal EnableDelayedExpansion set S= This is a test echo %S%. for /f "tokens=* delims= " %%a in ('echo %S%') do (set b=%%a & set b=!b: =_! & echo !b!) endlocal & goto :EOF 

    También puede quitar espacios en blanco pasando esas variables con espacios en blanco como parámetros en un sub y luego dentro de su sub, simplemente configúrelos nuevamente con los parámetros pasados.

     @echo off set "a= apple " set "b= banana " echo [%a%] echo [%b%] call :Strip %a% %b% pause goto :EOF :Strip set a=%1 set b=%2 echo [%a%] echo [%b%] ---------------- Results.... [ apple ] [ banana ] [apple] [banana] Press any key to continue . . . 

    La subrutina :trimAll continuación:

    • recorta las tabs y espacios iniciales y finales de la cuerda que se le pasa
    • se puede llamar con seguridad con la demora de la expansión desactivada o habilitada
    • maneja caracteres venenosos (ej ! , ! , % , ^ , etc.)
    • CR y LF no son compatibles

    Lea los comentarios de referencias e información.

     @echo off & setLocal enableExtensions disableDelayedExpansion :: https://www.dostips.com/forum/viewtopic.php?t=4308 (call;) %= sets errorLevel to 0 =% (set lf=^ %= BLANK LINE REQUIRED =% ) :: kudos to Carlos for superior method of capturing CR :: https://www.dostips.com/forum/viewtopic.php?p=40757#p40757 set "cr=" & if not defined cr for /f "skip=1" %%C in ( 'echo(^|replace ? . /w /u' ) do set "cr=%%C" set ^"orig= !random! ! ^^! ^^^^! ^"^^ ^&^"^& ^^^" %%os%% ^" call :trimAll res1 orig setLocal enableDelayedExpansion call :trimAll res2 orig echo(orig: [!orig!] echo(res1: [!res1!] echo(res2: [!res2!] endLocal endLocal & goto :EOF :trimAll result= original= :: trims leading and trailing whitespace from a string :: special thanks to Jeb for :: https://stackoverflow.com/a/8257951 setLocal set "ddx=!" %= is delayed expansion enabled or disabled? =% setLocal enableDelayedExpansion set "die=" & if not defined %2 ( >&2 echo( ERROR: var "%2" not defined & set "die=1" ) else set "str=!%2!" %= if =% if not defined die for %%L in ("!lf!") ^ do if "!str!" neq "!str:%%~L=!" ( >&2 echo( ERROR: var "%2" contains linefeeds & set "die=1" ) %= if =% if not defined die for %%C in ("!cr!") ^ do if "!str!" neq "!str:%%~C=!" ( >&2 echo( ERROR: var "%2" contains carriage returns set "die=1" ) %= if =% if defined die goto die (for /f eol^= %%A in ("!str!") do rem nop ) || ( >&2 echo(WARNING: var "%2" consists entirely of whitespace endLocal & endLocal & set "%1=" & exit /b 0 ) %= cond exec =% :: prepare string for trimming... :: double carets set "str=!str:^=^^^^!" :: double quotes set "str=!str:"=""!" :: escape exclaims set "str=%str:!=^^^!%" ! :: act of CALLing subfunction with :: expanded string trims trailing whitespace call :_trimAll "%%str%% :: prepare string to be passed over endLocal boundary... :: double carets again if delayed expansion enabled if not defined ddx set "str=!str:^=^^^^!" :: escape exclaims again if delayed expansion enabled if not defined ddx set "str=%str:!=^^^!%" ! :: restre quotes set "str=!str:""="!" :: pass string over endLocal boundary and trim leading whitespace for /f tokens^=*^ eol^= %%a in ("!str!") do ( endLocal & endLocal & set "%1=%%a" ! ) %= for /f =% exit /b 0 :die endLocal & endLocal & set "%1=" & exit /b 1 :_trimAll :: subfunction :: trailing exclaim is required as explained by Jeb at :: https://www.dostips.com/forum/viewtopic.php?p=6933#p6933 set "str=%~1" ! exit /b 0 

    HTH y HNY! 😉

    Gracias @Bradley Mountford

    Estoy usando el “Trim Right Whitespace” trabajando exactamente en mi “Show-Grp-of-UID.CMD”. 🙂 Otra idea para mejorar es bienvenida .. ^ _ ^

    establecer newVarNoSpaces =% someVarWithSpaces: =%