変数が事前定義されているときにこれを行う方法を知っています。ただし、ユーザーに何らかの入力を要求する場合、先頭と末尾の空白をどのようにトリムしますか?これは私がこれまでに持っているものです:
@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
遅延拡張を有効にする必要があります。これを試して:
@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
以下のソリューションは私にとって非常にうまく機能します。
4行のみほとんどの(すべて?)文字で動作します。
: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%]
私が使用している非常に短く簡単なソリューションはこれです:
@ECHO OFF
SET /p NAME=- NAME ?
ECHO "%NAME%"
CALL :TRIM %NAME% NAME
ECHO "%NAME%"
PAUSE
:TRIM
SET %2=%1
GOTO :EOF
結果:
- NAME ? my_name
" my_name "
"my_name"
関数と「サブ関数」への参照による呼び出し(はい、「バッチ」にもポインターがあります!)を使用したコンパクトなソリューションを提示したいと思います。
@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
Forumpieの答えを改善するために、トリックは%*
(すべてのパラメーター)サブ:
Edit:より多くの洞察を提供するために、TRIMサブルーチンparamsのエコーを追加しました
@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
これにより、先頭と末尾のスペースが削除されますが、すべてのスペースは保持されます。
" 1 2 3 4 "
"1 2 3 4"
%*の詳細: バッチパラメーター
私はこのようにしました(一時的に遅延拡張を有効にします):
...
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
または
@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
:trimAll
以下のサブルーチン:
!
、%
、^
など)参考文献や情報についてはコメントを読んでください。
@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と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
from http://www.netikka.net/tsneti/info/tscmd079.htm
先頭のスペースを削除します。
for /f "usebackq tokens=*" %%a in (`echo %StringWithLeadingSpaces%`) do set StringWithout=%%a
これは非常に簡単です。パラメータなしのfor
は、スペースを区切り文字と見なします。 tokens
パラメータとして「*」を設定すると、プログラムは、スペースではない文字列のすべての部分を収集し、独自のギャップを挿入する新しい文字列に配置します。
空白をパラメータとして変数に渡すことで空白を削除することもできます。サブ内では、渡されたパラメータを使用してそれらを再度設定するだけです。
@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 . . .