Je sais comment faire cela lorsque la variable est prédéfinie. Cependant, lorsque je demande à l'utilisateur d'entrer une sorte d'entrée, comment puis-je supprimer les espaces de début et de fin? C'est ce que j'ai jusqu'ici:
@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
Vous devez activer l'expansion retardée. Essaye ça:
@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 solution ci-dessous fonctionne très bien pour moi.
Seulement 4 lignes et fonctionne avec la plupart (tous?) Des caractères .
:Trim
SetLocal EnableDelayedExpansion
set Params=%*
for /f "tokens=1*" %%a in ("!Params!") do EndLocal & set %1=%%b
exit /b
@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%]
Une solution très courte et facile que j'utilise est la suivante:
@ECHO OFF
SET /p NAME=- NAME ?
ECHO "%NAME%"
CALL :TRIM %NAME% NAME
ECHO "%NAME%"
PAUSE
:TRIM
SET %2=%1
GOTO :EOF
Résulte en:
- NAME ? my_name
" my_name "
"my_name"
Je voudrais présenter une solution compacte utilisant un appel par référence (oui, "batch" a aussi des pointeurs!) Vers une fonction et une "sous-fonction":
@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
Pour améliorer la réponse de Forumpie, l'astuce consiste à utiliser %*
(tous les paramètres) dans le sous-dossier:
Edit: Ajout de l'écho des paramètres de la sous-routine TRIM, pour fournir plus d'informations.
@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
Cela supprime les espaces de début et de fin, mais conserve tous les espaces entre eux.
" 1 2 3 4 "
"1 2 3 4"
Détails de% *: Paramètres de lot
Je l'ai fait comme ça (activer temporairement l'expansion retardée):
...
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.
....
@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
ou
@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
Le sous-programme :trimAll
ci-dessous:
!
, %
, ^
, etc.)Lisez les commentaires pour les références et les informations.
@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:!=^^^!%" !
:: 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 et HNY! ;)
@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
pour supprimer les espaces de début.
for /f "usebackq tokens=*" %%a in (`echo %StringWithLeadingSpaces%`) do set StringWithout=%%a
C'est très simple. for
sans aucun paramètre considère les espaces comme des délimiteurs; Si vous définissez "*" comme paramètre tokens
, le programme regroupe toutes les parties de la chaîne qui ne sont pas des espaces et les place dans une nouvelle chaîne dans laquelle il insère des espaces vides.
Vous pouvez également supprimer les espaces en transmettant ces variables avec les espaces en tant que paramètres à un sous-objet, puis à l'intérieur de votre sous-jeu, vous devez simplement les redéfinir avec les paramètres passés.
@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 . . .