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