Как исправить добавление метки времени при перемещении папки на удаленном сервере в новое место на удаленном сервере? - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь запустить пакетный скрипт на моем локальном компьютере, который позаботится о архивировании журналов на некоторых серверах.Я могу получить доступ к серверам через файловый менеджер "\ SERVERNAME \ C $ \ SOME FOLDER."Когда я пытаюсь скопировать данные из источника в место назначения локально и добавить временную метку, например, переменная TIMESTAMP не сохраняет мою конкатенацию даты / времени.

Это для серверов windows 2012r2, я пытался добавитьпросто дата \ время до конца, которая работает нормально, однако, это не тот формат, который я ищу, и он начинает вложение каталога с датой, но без времени, и это выглядит как беспорядок.: (

Я также пытался использовать wmic, однако я впервые пишу командный файл для автоматизации некоторых задач, поэтому все это было очень полезно для обучения.

Iя пытался echo %TIMESTAMP% и ничего не возвращается? Я даже пытался добавить конкатенацию (%CUR_YYYY%%CUR_MM%%CUR_DD%-%CUR_HH%%CUR_NN%%CUR_SS%) непосредственно в каталог файлов, и она не работает: (

REM Check to see if a service on the machine is stopped (it is always stopped by the time it gets here) before we move the files from the logging directory to a new one.
for /F "tokens=3 delims=: " %%H in ('sc \\REMOTESERVER query "SOME SERVICE NAME" ^| findstr "        STATE"') do (
  if /I "%%H" == "STOPPED" (
    REM substring the date and time and then concat it together at the end to make the desired timestamp variable
      set CUR_YYYY = %date:~10,4%
      set CUR_MM = %date:~4,2%
      set CUR_DD = %date:~7,2%
      set CUR_HH = %time:~0,2%
      set CUR_NN = %time:~3,2%
      set CUR_SS = %time:~6,2%
      set CUR_MS = %time:~9,2%
      set TIMESTAMP = %CUR_YYYY%%CUR_MM%%CUR_DD%-%CUR_HH%%CUR_NN%%CUR_SS%

    REM copy files from the servers source directory and then move the files to a newly created logging folder with a timestamp appened at the end
    echo d | xcopy /f /y "\\REMOTE SERVER\src" "\\REMOTE SERVER\dest\Logging_%TIMESTAMP%" /E /I
    REM delete the contents of the servers source directory to keep things nice and clean
    pushd \\REMOTE SERVER\src && del . /F /Q popd
  )
)

Ожидаемый результат будет выглядетьНапример: SourceFolder на сервере будет, но в пустом DestinationFolder будет создана новая папка Logging Logging_20190325010101, и во вновь созданной папке Logging должно быть все содержимое из SourceFolder.

Ответы [ 2 ]

1 голос
/ 25 марта 2019

Вам нужно избавиться от пробелов до и после вашего = в ваших командах set. Также вам нужно delayedexpansion в кодовом блоке с изменяющимися переменными, и есть лучший способ избавиться от двоеточий и запятая.

@echo off
setlocal enabledelayedexpansion
REM Check to see if a service on the machine is stopped (it is always stopped by the time it gets here) before we move the files from the logging directory to a new one.
for /F "tokens=3 delims=: " %%H in ('sc \\REMOTESERVER query "SOME SERVICE NAME" ^| findstr "        STATE"') do (
  if /I "%%H" == "STOPPED" (
REM substring the date and time and then concat it together at the end to make the desired timestamp variable
  set "CUR_YYYY=%date:~10,4%"
  set "CUR_MM=%date:~4,2%"
  set "CUR_DD=%date:~7,2%"
  set "mytime=!time::=!"
  set "mytime=!mytime:,=!"
  set "TIMESTAMP=!CUR_YYYY!!CUR_MM!!CUR_DD!-!mytime!"

REM copy files from the servers source directory and then move the files to a newly created logging folder with a timestamp appened at the end
echo d | xcopy /f /y "\\REMOTE SERVER\src" "\\REMOTE SERVER\dest\Logging_!TIMESTAMP!" /E /I
REM delete the contents of the servers source directory to keep things nice and clean
pushd \\REMOTE SERVER\src && del . /F /Q popd
 )
)

Чтобы объяснить вашу проблему, однако, когда вы устанавливаете переменную, пробел входит в состав переменной .. Итак:

set variable = value

Результатом будет переменная с завершающим пробелом %variable % и значением с начальным пробелом <space>value Таким образом, мы всегда избавляемся от пробелов и лучше всего использовать двойные кавычки для устранения возможных пробелов после значения. например:

set "variable=value"

, который создаст %variable% и value

0 голосов
/ 25 марта 2019

Внутри блоков кода в скобках вы должны отложить расширение при получении значений переменных в том же блоке, в котором они были установлены.Например:

(
    set "test=1"
    echo [%test%]
)

... будет отображать "[]", потому что %test% было извлечено в том же блоке кодов в скобках, в котором было установлено ,В то время как %test% оценивается, оно не имеет значения.Вы должны отложить расширение, используя setlocal enabledelayedexpansion или call echo [%%test%%] (или cmd /c или аналогичный).При использовании setlocal enabledelayedexpansion вы задерживаете расширение, используя ! вместо % для обозначения переменных.См. setlocal /? и set /? в консоли cmd для получения дополнительной информации - в частности, в разделе set /?, который начинается «Наконец, добавлена ​​поддержка отложенного расширения переменных среды».

Кроме того, это значительноболее простой и более независимый от языка язык для составления вашей временной метки, используя wmic os get localdatetime.Пример:

for /f "delims=." %%I in ('wmic os get localdatetime /value ^| find "="') do set "%%~I"
echo %localdatetime%

В результате %localdatetime% будет содержать текущее числовое значение ГГГГММДДЧЧММСС.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...