una separacion quitar para numero los inicio espacios espacio entre eliminar como celdas celda borrar blanco input batch-file whitespace trim

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



quitar espacios en blanco excel (12)

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

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


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= a b c set Expected=a b c 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%]


La subrutina :trimAll continuación:

  • recorta las pestañas 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://.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:!=^^^!%" ! :: restore 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! ;)


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=<Result.txt @echo ITEM is %ITEM%. setlocal enabledelayedexpansion for /l %%a in (1,1,100) do if "!ITEM:~-1!"==" " set ITEM=!ITEM:~0,-1! setlocal disabledelayedexpansion @echo Var ITEM=%ITEM% now has trailing spaces trimmed. ....


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


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 . . .


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"


establecer newVarNoSpaces =% someVarWithSpaces: =%


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


@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


@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