set "right= "
Всегда хорошая идея использовать кавычки в set
строковых командах.
Демонстрация с использованием передовых методов ...
@ECHO OFF
SETLOCAL
:: a variable with many spaces
SET "spaces= "
SET "myvar="
ECHO Hello%myvar%World
CALL :addspaces myvar 2
ECHO Hello%myvar%World
CALL :addspaces myvar 3
ECHO Hello%myvar%World
SET "mynewvar=Another"
ECHO %mynewvar%Spaces
CALL :addspaces mynewvar 3
ECHO %mynewvar%Spaces
ECHO ----------------Another method --------
SET "myvar="
ECHO Another%myvar%method
CALL :addchars myvar 2
ECHO Another%myvar%method
CALL :addchars myvar 3 x
ECHO Another%myvar%method
SET "mynewvar=Batch is "
ECHO %mynewvar%easy
CALL :addchars mynewvar 13 "so "
ECHO %mynewvar%easy
PAUSE
GOTO :eof
:: To variable name %1, add %2 spaces
:addspaces
CALL SET "%1=%%%1%%%%spaces:~-%2%%"
GOTO :eof
:: To variable name %1, add %2 of %3;spaces if %3 is missing
:addchars
FOR /L %%Z IN (1,1,%2) DO IF "%~3"=="" (CALL SET "%1=%%%1%% ") ELSE (CALL SET "%1=%%%1%%%~3")
GOTO :eof
Две подпрограммы требуют объяснения.
В связи с тем, как работает cmd
, в подпрограмме :addspaces
set
имеет значение CALL
ed, и перед выполнением выполняются следующие замены - чтение слева направо
установите "% 1 = %%% 1 %%%% пробелов: ~ -% 2 %%"
сначала, замените значения параметра на% 1 ..% 9
set "parameter1
= %% parameter1
%%%% Пробелы: ~ - parameter2
%%"
Далее, наблюдать escape-последовательности, %
escape %
set "параметр1 = %
параметр1 %%
пробелы: ~ -parameter2 %
"
Когда эта команда выполняется, онаповторно анализируется как
set "параметр1 = содержимое параметра1 % пробелов: ~ * содержимое ** параметра2 *%"
Вторая процедура - это другой подход, такой жеИспользуется трюк для разбора, но на этот раз добавляется третий параметр, который может быть символомr или строка, и если повторяющаяся строка содержит символ-разделитель, такой как пробел, то это должно быть "quoted"
.