1

Мне нужно разрезать переменные на две меньшие переменные после последней точки. Например, переменная " european.union " будет иметь вид vara=european и varb=union

Я использую следующий код для достижения этой цели:

for /f "tokens=1 delims=." %%a in ("%elvariato%") do set vara=%%a
for /f "tokens=2 delims=." %%a in ("%elvariato%") do set varb=%%a

Проблема заключается в том, что этот код не может управлять несколько «» расщепленной переменными. Например, переменная . полностью сделает этот код бесполезным.

vara="spain is in" varb=the будет выходной, но мне нужно vara="spain is in.the.european" varb=union

Не беспокойтесь о переменных пространствах, я могу ими управлять.

Я хочу разделить переменную в последней точке . но я не знаю, как этого добиться. Я попытался прочитать общее количество токенов, чтобы объединить все токены до N-1, но это не сработало. Невозможность узнать количество точек до того, как переменная проанализирована скриптом, делает это довольно сложно. Любое предложение?

3 ответа3

2

Я предлагаю использовать PowerShell ;-).

$text = "spain is in.the.european.union"
$vara = $text.Substring(0, $text.lastIndexOf('.'))
$varb = $text.Split(".")[-1]

выход:

PS C:\WINDOWS\system32> $vara
spain is in.the.european

PS C:\WINDOWS\system32> $varb
union

чтобы использовать это в сценарии cmd, это правильно установит %vara% и %varb% , чтобы использовать его далее в вашем сценарии cmd.

for /f "delims=" %%a in (' powershell "$env:elvariato.Substring(0, $env:elvariato.lastIndexOf('.'))" ') do set "vara=%%a"
for /f "delims=" %%a in (' powershell "$env:elvariato.split('.')[-1]" ') do set "varb=%%a"

%vara% содержит spain is in.the.european и %varb% содержит union в этом случае

Объяснение:

  • Substring(0, $text.lastIndexOf('.')) Получает все от начала строки (0) до последнего .
  • split('.')[-1] разбивает вашу строку на каждую точку и получает последнее значение в созданном массиве
1

Следующий (частично прокомментированный) фрагмент кода демонстрирует чистое решение для пакетных файлов:

@ECHO OFF
rem default/expected: SETLOCAL EnableExtensions DisableDelayedExpansion
if "%~1"=="" (
  set "elvariato=spain is in.the.european.union"      asked example value
) else (
  set "elvariato=%~1"                                 supplied sample value 
)
set "_dot_pos="      
set "nodots=%elvariato:.=%"                           check for any dot presence
if "%nodots%"=="%elvariato%" goto :jjloopEnd          
set /a jj=1
:jjloop              compute last dot position (counted from the end of string)
  call set "_auxiliary=%%elvariato:~-%jj%%%"
  set "_aux_1char=%_auxiliary:~0,1%"
  if "%_aux_1char%"=="." (
      set /A _dot_pos=jj
      set /A _dot_pre=jj - 1
      goto :jjloopEnd
  )
  set /a jj+=1
  goto :jjloop
:jjloopEnd
if not defined _dot_pos (
    rem string does not contain any dot character at all
    set "vara=%elvariato%"
    set "varb="
    goto :showResults
)
call set "vara=%%elvariato:~0,-%_dot_pos%%%"
if %_dot_pos% EQU 1 (
    set "varb="
) else (
    call set "varb=%%elvariato:~-%_dot_pre%%%"
)
:showResults
rem debugging output 
echo vara="%vara%" varb="%varb%"
goto :eof

Образец вывода:

==> D:\bat\SU\1302882c.bat
vara="spain is in.the.european" varb="union"

==> D:\bat\SU\1302882c.bat "."      a dot only
vara="" varb=""

==> D:\bat\SU\1302882c.bat "nodots"
vara="nodots" varb=""

==> D:\bat\SU\1302882c.bat ".leading dot only"
vara="" varb="leading dot only"

==> D:\bat\SU\1302882c.bat "trailing dot only."
vara="trailing dot only" varb=""

==> D:\bat\SU\1302882c.bat "1st.dot.2nd.dot.another.dot.more.dots"
vara="1st.dot.2nd.dot.another.dot.more" varb="dots"

Ресурсы (требуется чтение, не полностью):

0

Это может быть «обманом», но, если ваш разделитель - точка (« . »), Вы можете использовать хитрость: притвориться, что ваша строка является именем файла:

setlocal enabledelayedexpansion
    ︙
for %%A in (%elvariato%) do set "vara=%%~nA" & set "varb_plus=%%~xA"
for /f "delims=. tokens=1" %%B in ("!varb_plus!") do set varb=%%B

%%~nA и %%~xA рассматривают %%A как путь и извлекают часть базового имени файла и расширение соответственно.  Базовое имя файла определяется как все до последней точки, так что это ваша vara .  Расширение является последней точкой и всем после нее (например, « .txt »), а это не то, что вам нужно.  Поэтому мы присваиваем расширение varb_plus - это желаемое значение для varb плюс точка.  Тогда легко использовать for /f "delims=. tokens=1" чтобы получить часть после точки.

Так как %%~nA возвращает часть базового имени файла %%A , произойдет сбой, если ваша полная переменная содержит / или \ .  Вы можете справиться с этим, посмотрев на %%~pA (часть пути %%A), но не сразу понятно, как это сделать, особенно если он может содержать либо / либо \ .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .