Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Переименование с проверкой файла (NirCmd) (http://forum.oszone.net/showthread.php?t=332984)

lSVl 04-02-2018 14:51 2795742

Переименование с проверкой файла (NirCmd)
 
Помогите, пожалуйста с написанием скрипта
(с использованием NirCmd)
  1. Завершить процесс ModBusSrv.exe
    Код:

    nircmd.exe killprocess ModBusSrv.exe
  2. Дождаться завершения процесса ModBusSrv.exe
    Код:

    nircmd.exe waitprocess ModBusSrv.exe
  3. Переименовать файл log.dat в log_dd_mm_yyyy.dat
    Код:

    nircmd.exe execmd ren "log.dat" "log_~$currdate.dd_MM_yyyy$.dat"
  4. Проверить наличие файла log_dd_mm_yyyy.dat
    Код:

    nircmd.exe execmd if exist "log_~$currdate.dd_MM_yyyy$.dat"
    если есть запустить ModBusSrv.exe
    Код:

    start "" /d "%~dp0" /b "%~dp0ModBusSrv.exe"
    если нет п.1-3
  5. Запись результата работы скрипта в >"%~dp0ren_log.log"
  6. Exit
ModBusSrv.exe – сервер
log.dat – база данных(создается и пишется сервером)

alpap 04-02-2018 18:39 2795800

что-то в последней строке nircmd не наблюдаю. Да, сарказм. А без nircmd лишат какой-то лицензии или работы?

lSVl 04-02-2018 19:22 2795807

alpap, без флуда никак?

alpap 04-02-2018 22:54 2795835

lSVl,
в этой ветке никто никого не обязывает использовать nircmd, поэтому мой вопрос открыт, а именно: Можно решить задачу без использования (или почти без использования) nircmd?
И да. В смысле при ответе - да, задачу и условие в студию.

lSVl 05-02-2018 10:15 2795887

alpap, На NirCmd пал выбор из-за переменной ~$currdate.TimeFormat$, можно и с частичным использованием…
Есть сервер ModBusSrv.exe, который в процессе своей работы создает и пишет базу log.dat. Со временем log.dat разрастается до огромных размеров… Необходимо раз в месяц «резать» базу. Задача написать скрипт который
  1. Завершает процесс ModBusSrv.exe
  2. Ждет завершения процесса ModBusSrv.exe
  3. Переименовывает log.dat в log_dd_mm_yyyy.dat
  4. Проверяет наличие файла log_dd_mm_yyyy.dat
  5. Запускает ModBusSrv.exe
  6. Запись результата работы скрипта в >"%~dp0ren_log.log"
Код:

@echo off
"%~dp0cmdow.exe" @ /HID
:no
nircmd.exe killprocess ModBusSrv.exe
nircmd.exe waitprocess ModBusSrv.exe
nircmd.exe execmd ren "log.dat" "log_~$currdate.dd_MM_yyyy$.dat"
nircmd.exe wait 3000
nircmd.exe execmd if not exist "log_~$currdate.dd_MM_yyyy$.dat" goto :no
start "" /d "%~dp0" /b "%~dp0ModBusSrv.exe"
exit

Скрипт запускается планировщиком задач.
Так работает, но хочется более правильного решения, и запись результата работы скрипта в >"%~dp0ren_log.log"

Patroklos 05-02-2018 11:31 2795901

Можно получить дату и нативными средствами. Пример:
Код:

FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "@Tdate=%%d"
set TDStamp=%@Tdate:~0,4%-%@Tdate:~4,2%-%@Tdate:~6,2%_%@Tdate:~8,2%-%@Tdate:~10,2%-%@Tdate:~12,2%

А это ещё примеры
Код:

@echo off
FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "@Tdate=%%d"
        Set "var0=%@Tdate:~0,4%"
        Set "var1=%@Tdate:~4,2%"
        Set "var2=%@Tdate:~6,2%"
        Set "var3=%@Tdate:~8,2%"
        Set "var4=%@Tdate:~10,2%"
        Set "var5=%@Tdate:~12,2%"
echo all=%@Tdate%       
echo var0=%var0%
echo var1=%var1%
echo var2=%var2%
echo var3=%var3%
echo var4=%var4%
echo var5=%var5%
echo.
echo example0=%var0%-%var1%-%var2%_%var3%-%var4%-%var5%
echo.     
echo example1=[%@Tdate:~0,4%-%@Tdate:~4,2%-%@Tdate:~6,2%]_[%@Tdate:~8,2%-%@Tdate:~10,2%-%@Tdate:~12,2%]
echo.     
echo example2=[%@Tdate:~0,4%]-[%@Tdate:~4,2%]-[%@Tdate:~6,2%]_[%@Tdate:~8,2%]-[%@Tdate:~10,2%]-[%@Tdate:~12,2%]
echo.     
echo example3=[%@Tdate:~0,4%%@Tdate:~4,2%%@Tdate:~6,2%]_[%@Tdate:~8,2%%@Tdate:~10,2%%@Tdate:~12,2%]
echo.     
echo example4=[%@Tdate:~0,4%_%@Tdate:~4,2%_%@Tdate:~6,2%]_[%@Tdate:~8,2%_%@Tdate:~10,2%_%@Tdate:~12,2%]
echo.     
echo example5=%@Tdate:~0,4%_%@Tdate:~4,2%_%@Tdate:~6,2%_%@Tdate:~8,2%_%@Tdate:~10,2%_%@Tdate:~12,2%
echo.     
echo example6=%@Tdate:~0,4%_%@Tdate:~4,2%_%@Tdate:~6,2%~%@Tdate:~8,2%_%@Tdate:~10,2%_%@Tdate:~12,2%
echo.     
echo example7=[%@Tdate:~0,4%~%@Tdate:~4,2%~%@Tdate:~6,2%]~[%@Tdate:~8,2%~%@Tdate:~10,2%~%@Tdate:~12,2%]
echo.     
echo example8=%@Tdate:~0,4%~%@Tdate:~4,2%~%@Tdate:~6,2%_%@Tdate:~8,2%~%@Tdate:~10,2%~%@Tdate:~12,2%
echo.

>nul pause
2018-01-24_16-11-12
[2018][01][24][16][11][12]
[20180124][161112]
20180124161112


lSVl 05-02-2018 17:26 2795979

Подскажите, пожалуйста где ошибка?
Код:

for %%x in (nircmd.exe clipboard set ~$currdate.dd_MM_yyyy$) do ren "%~dp0log.dat" "log_%%x.dat"

Petya V4sechkin 05-02-2018 19:46 2796034

lSVl, а что вы, собственно, хотите сделать?

lSVl 05-02-2018 20:06 2796039

В данном случае переименовать файл
Код:

nircmd.exe clipboard set ~$currdate.dd_MM_yyyy$
05_02_2018

lSVl 05-02-2018 22:15 2796067

Код:

@echo off
"%~dp0cmdow.exe" @ /HID
FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "@Tdate=%%d"
        Set "var0=%@Tdate:~0,4%"
        Set "var1=%@Tdate:~4,2%"
        Set "var2=%@Tdate:~6,2%"
        Set "var3=%@Tdate:~8,2%"
        Set "var4=%@Tdate:~10,2%"
        Set "var5=%@Tdate:~12,2%"
        Set "srv=%~dp0ModBusSrv.exe"
        Set "log=%~dp0log.dat"
@echo >"%~dp0ren_log.log"
nircmd.exe killprocess "%srv%"
nircmd.exe waitprocess "%srv%"
@echo %srv% остановлен %var2%.%var1%.%var0% %var3%:%var4%:%var5%>>"%~dp0ren_log.log"
if exist "%log%" ren "%log%" "log_%var2%_%var1%_%var0%.dat"
@echo %log% переименован %var2%.%var1%.%var0% %var3%:%var4%:%var5%>>"%~dp0ren_log.log"
nircmd.exe wait 3000
nircmd.exe execmd "%srv%"
@echo %srv% запущен %var2%.%var1%.%var0% %var3%:%var4%:%var5%>>"%~dp0ren_log.log"
exit

Не правильно записывается время
ђҐ¦Ё¬ ўлў®¤* Є®¬**¤ ** нЄа** (ECHO) ®вЄ«озҐ*.
G:\Work\ModBusSrv.exe остановлен 05.02.2018 21:05:19
G:\Work\log.dat переименован 05.02.2018 21:05:19
G:\Work\ModBusSrv.exe запущен 05.02.2018 21:05:19
Подскажите пожалуйста как исправить

Patroklos 05-02-2018 22:31 2796075

Я не настоящий сварщик поэтому запись в лог не осилил. Но примерно то что тебе нужно набросал.
Смотри файлы в аттаче. Один приспособлен для тестов и проверяет обычный вин блокнот. Второй боевой.
Не забывай про тесты и бэкапы!
Код:

@echo off
>nul chcp 65001
cd /d "%~dp0"
rem nice script без coolest nircmd
rem Получим число и время и поместим в переменную
FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "@Tdate=%%d"
rem 1 Завершить процесс ModBusSrv.exe
taskkill /im ModBusSrv.exe
rem 2 Ждём и проверяем работает ли аппликация
:Jdem
timeout /t 30 >nul
tasklist /FI "IMAGENAME eq ModBusSrv.exe" 2>NUL | find /I /N "ModBusSrv.exe">NUL
if "%ERRORLEVEL%"=="0" echo Program still running & goto Jdem
rem 3 Переименовать файл log.dat в log_dd_mm_yyyy.dat
ren log.dat log_%@Tdate:~0,4%_%@Tdate:~4,2%_%@Tdate:~6,2%_%@Tdate:~8,2%_%@Tdate:~10,2%_%@Tdate:~12,2%.dat
rem 4 Проверить наличие файла log_dd_mm_yyyy.dat
if not exist log_%@Tdate:~0,4%_%@Tdate:~4,2%_%@Tdate:~6,2%_%@Tdate:~8,2%_%@Tdate:~10,2%_%@Tdate:~12,2%.dat (
cls & color 40 & echo Log File Missing!!! & pause >nul ) else (
rem если есть запустить ModBusSrv.exe
start "" ModBusSrv.exe )
pause >nul


Patroklos 05-02-2018 22:33 2796077

Вложений: 1
аттач

Patroklos 05-02-2018 22:38 2796079

Цитата:

Цитата lSVl
Не правильно записывается время
ђҐ¦Ё¬ ўлў®¤* Є®¬**¤ ** нЄа** (ECHO) ®вЄ«озҐ*. »

Судя по кракозябрам ты редактируешь батники в виндовс блокноте.
Установи себе notepad++ и редактируй в нём. В случае моих батников сохраняй их в utf-8.
В notepad++ кодировка видна в самом низу с правой стороны.

lSVl 06-02-2018 01:17 2796126

Patroklos, Спасибо


Время: 02:53.

Время: 02:53.
© OSzone.net 2001-