Jak odjąć wartości z ciągu numerycznego w wierszu polecenia systemu Windows?

2

W wierszu polecenia systemu Windows mogę wydrukować rok bieżącej daty, wykonując następujące czynności:

echo %date:~10,4%

wynik: 2016

Oczywiście, w zależności od tego, jak daty są wyświetlane w Twoim języku, musisz zmienić 10 lub 4 aby uzyskać prawidłowy ciąg podrzędny. Ale jest dobrze.

Chcę, żeby go wydrukowano 2015, który jest 2016 - 1. Jak więc odjąć 1 od podciągu, który właśnie przechwyciłem? Nie ma problemu z użyciem zmiennych pomocniczych.

Gustavo
źródło
ta data jest skomplikowana dzięki powłoce wsadowej systemu Windows, a także nieodwracalna. Proponuję użycie PowerShell. (Get-Date).year -1 proste i jasne. Muszę kochać PowerShell. umieść go w zmiennej do dalszego wykorzystania.
SimonS

Odpowiedzi:

3

Jak już powiedziałeś, nie ma problemu z użyciem innej zmiennej, możesz to zrobić w następujący sposób (Moje ustawienia środowiska używają innego podciągu)

set /a "yearminus1=%date:~6,10%-1"

enter image description here

Dla ciebie zakładam, że tak będzie set /a "yearminus1=%date:~10,4%-1", ale nie mogę tego przetestować.

Używając /a przełącz się z set określa, że ​​będziesz podawać wyrażenie do oceny, a nie tylko przechowywać wyrażenie w zmiennej takiej, jaka jest.

Można użyć następujących operatorów:

   +   Add                set /a "_num=_num+5"
   +=  Add variable       set /a "_num+=5"
   -   Subtract (or unary)set /a "_num=_num-5"
   -=  Subtract variable  set /a "_num-=5"
   *   Multiply           set /a "_num=_num*5"
   *=  Multiply variable  set /a "_num*=5"
   /   Divide             set /a "_num=_num/5"
   /=  Divide variable    set /a "_num/=5"
   %   Modulus            set /a "_num=5%%2"
   %%= Modulus            set /a "_num%%=5" 
   !   Logical negation  0 (FALSE) ⇨ 1 (TRUE) and any non-zero value (TRUE) ⇨ 0 (FALSE)
   ~   One's complement (bitwise negation) 
   &   AND                set /a "_num=5&3"    0101 AND 0011 = 0001 (decimal 1)
   &=  AND variable       set /a "_num&=3"
   |   OR                 set /a "_num=5|3"    0101 OR 0011 = 0111 (decimal 7)
   |=  OR variable        set /a "_num|=3"
   ^   XOR                set /a "_num=5^3"    0101 XOR 0011 = 0110 (decimal 6)
   ^=  XOR variable       set /a "_num=^3"
   <<  Left Shift.    (sign bit ⇨ 0)
   >>  Right Shift.   (Fills in the sign bit such that a negative number always remains negative.)
                       Neither ShiftRight nor ShiftLeft will detect overflow.
   <<= Left Shift variable     set /a "_num<<=2"
   >>= Right Shift variable    set /a "_num>>=2"

  ( )  Parenthesis group expressions  set /a "_num=(2+3)*5"
   ,   Commas separate expressions    set /a "_num=2,_result=_num*5"

Z tutaj .

Jonno
źródło
set /a "yearminus1=%date:~6,10%-1" daje mi „brakujący operand”
johny why
0

Jak ustawić zmienną, która jest rokiem ubiegłego roku?

Użyj następującego pliku wsadowego (test.cmd):

@echo off
setlocal
setlocal enabledelayedexpansion
for /f "usebackq delims=/ tokens=3 " %%i in (`date /t`) do (
  echo Current year is %%i
  set /a "_lastyear=%%i-1"
  echo Last year is !_lastyear!
  )
endlocal

Wydajność:

F:\test>test
Current year is 2016
Last year is 2015

W twoim konkretnym przypadku powinieneś móc skorzystać z następujących opcji:

set_year=%date:~10,4%
set /a "_lastyear=%%i-1"
echo %_lastyear%

Dalsze czytanie

  • Indeks A-Z wiersza polecenia Windows CMD - Doskonałe odniesienie dla wszystkich rzeczy związanych z linią Windows cmd.
  • data - Wyświetl lub zmień datę. Wyświetl lub zmień datę.
  • dla / f - Polecenie pętli przeciwko wynikom innego polecenia.
  • zestaw - Wyświetl, ustaw lub usuń zmienne środowiskowe CMD. Zmiany wprowadzone za pomocą SET pozostaną tylko na czas bieżącej sesji CMD.
DavidPostill
źródło
Właściwie to mogę. Problem w twoim przypadku polegał na tym, że twoja data powinna wyglądać mniej więcej tak 2016/02/12 i używając 10 jako parametru indeksu nie można wyodrębnić podciągów, ponieważ jest zbyt krótki (indeksy od 0 do 9). Próbować echo %date% lub echo %date:~0,4% i to zadziała.
Gustavo
Niezależnie od tego moja odpowiedź pokazuje, jak „odjąć 1 od podciągów, które właśnie przechwyciłem?”
DavidPostill
Dodałem kilka wierszy do odpowiedzi, aby zająć się konkretną sprawą.
DavidPostill