none
Проверка доступности файла RRS feed

  • Вопрос

  • Уважаемые, не подскажете как своять скрипт который бы выполнял следующее: проверял бы по указанному пути наличие конкретного файла с интервалом в 30 сек. и если этот файл есть то выполнял действие, скажем создавался бы файл ok.log в ктором с тем же интервалом и отображением времени писал бы ok:
    01.01.2009 13:00:00 ok
    01.01.2009 13:00:30 ok
    ....
    ....
    01.01.2009 14:00:00 ok.
    Если же файл не доступен (а именно в этом и соль - именно не доступен по сети), то выполнялось бы действие, скажем создается файл error.log, в котором бы отображалось:
    01.01.2009 14:00:30 error
    01.01.2009 14:01:00 error
    ....
    ....
    01.01.2009 14:30:00 error.
     
    Заранее спасибо за помощь. 

Ответы

  • можно например так:

    IF EXIST c:\cmd01.txt (
           echo %date% %time% ok >> c:\result\success.log
       ) ELSE (
           echo %date% %time% error >> c:\result\error.log
       )

    mcp, mcdba, mcsa, mcse, ccna
  • а раньше об этом попросить нельзя было? Лично у меня нету никакого желания телепатировать ваши хотелки.

    if (test-path \\server\share\file.ext) {(Get-Date).Tostring() + " ok" >> ok.log} else {(Get-Date).Tostring() + " error" >> error.log}


    [тут могла быть ваша реклама] http://www.sysadmins.lv
    • Предложено в качестве ответа Vadims PodansMVP 27 мая 2009 г. 8:59
    • Предложено в качестве ответа Vadims PodansMVP 27 мая 2009 г. 8:59
    • Помечено в качестве ответа Vasily GusevModerator 3 июня 2009 г. 4:25

Все ответы

  • можно например так:

    IF EXIST c:\cmd01.txt (
           echo %date% %time% ok >> c:\result\success.log
       ) ELSE (
           echo %date% %time% error >> c:\result\error.log
       )

    mcp, mcdba, mcsa, mcse, ccna
  • Вероятно не до конца пояснил задачу. Необходимо проверять доступность файла на сервере, на расшареной папке  с клиентской машины - это меняет ситуацию.
  • это ничего не меняет. Просто указываете UNC путь к файлу и всё, т.е. if exist \\server\share\file.ext (...) else (...)
    [тут могла быть ваша реклама] http://www.sysadmins.lv
  • Вы мне дали возможность работать с bat-файлом, а нельзя ли это реализовать на VBScript или на PowerShell.
  • а раньше об этом попросить нельзя было? Лично у меня нету никакого желания телепатировать ваши хотелки.

    if (test-path \\server\share\file.ext) {(Get-Date).Tostring() + " ok" >> ok.log} else {(Get-Date).Tostring() + " error" >> error.log}


    [тут могла быть ваша реклама] http://www.sysadmins.lv
    • Предложено в качестве ответа Vadims PodansMVP 27 мая 2009 г. 8:59
    • Предложено в качестве ответа Vadims PodansMVP 27 мая 2009 г. 8:59
    • Помечено в качестве ответа Vasily GusevModerator 3 июня 2009 г. 4:25
  • А не подскажете как запустить выполнение этой команды на удаленном компьютере, есть правда один нюанс , мне необходимо запускать этот код с W2k3, а выполняться он должен на клиентской машине WXP.
  • в принципе, если есть возможность, можно использовать административные шары, т.е.:

    if (test-path \\WinXP\с$\file.ext) {(Get-Date).Tostring() + " ok" >> ok.log} else {(Get-Date).Tostring() + " error" >> error.log}
    вместо WinXP следует указать имя компьютера, на котором нужно проверять и дальше указываете административную шару (в данном случае корень диска C: удалённой машины). А логи будут сохраняться локально.
    [тут могла быть ваша реклама] http://www.sysadmins.lv
  • К сожалению задача состоит в том, чтобы проверять с машины клиента доступность некоего файла (произвольного) на некоей (произвольной) шаре на сервере (произвольном), а выполнять запуск этой задачи будет SCOM ну там дальше уже идут всякие мониторы и алерты, с этим я справлюсь, а вот со скриптописанием туго. Мне необходимо доказать, то что при запросе к файлу с клиентской машины - файл доступен и следить за этим будет SCOM.
  • в вашем случае тогда первый вариант с Test-Path и использовать psexec или через WMI Win32_process.


    [тут могла быть ваша реклама] http://www.sysadmins.lv
  • То есть действуем по рекомендации:
    if
    
    
     (test-path \\server\share\file.ext) {(Get-Date).Tostring() + " ok"
    
    
     >> ok.log} else
    
    
     {(Get-Date).Tostring() + " error"
    
    
     >> error.log}
    вот только единственный вопрос как запусить эту команду скажем из исполняемого файла, с указанием места куда ложатся файлы логов.
  • Еще один вопросец, почему при попытке выполнить команду psexec \\remotemashine c:\test.cmd
    выдается ошибка: c:\test.cmd exited on remotemashine with error code 1.

    В файле test.cmd:
    IF EXIST "\\target\c$\cmd01.txt" (
    echo ok > \\testmashine\d$\log.log
    ) ELSE (
    echo error > \\testmashine\d$\log.log
    )
  • по всей видимости батнику не удалось создать лог-файл. Вариантов много, начиная от нехватки прав, до отсутствия доступа к testmachine.
    [тут могла быть ваша реклама] http://www.sysadmins.lv
  • Как то так:

    param ($Logpath = "c:\logs")
    if (test-path \\server\share\file.ext)
    {
        (Get-Date).Tostring() + " ok" | Out-File "$LogPath\ok.log" -Append}
    else
    {
        (Get-Date).Tostring() + " error" | Out-File "$LogPath\error.log" -Append}
    }

    По умолчанию значение $Logpath = "c:\logs"
    Вызываем так:
    C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe -commmand c:\scripts\myscript.ps1 -logpath c:\mylogs
    или так (с путём по умолчанию):
    powershell c:\scripts\myscript.ps1
    Для отладки, чтобы окно не закрывалось сразу, можно добавить ключ -noexit:
    powershell -noexit c:\scripts\myscript.ps1

    Вообще очень рекомендую посмотреть вот этот скринкаст - http://www.techdays.ru/videos/1187.html Я в нём как раз постарался рассказать о том как делать такие вещи.
    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    Модератор
  • То есть как я понимаю, не существует варианта запуска такого cmd-файла не указав в явном виде юзера и пароля. Плохо - очень плохо. Мжет быть причина в ОС на этих машинах: target - серверная ОС, testmashine - тоже серверная, а вот запускаю я этот батник на XP, но с приавами все в порядке, все учетки добавлены куда нужно?
  • Не понял причем тут имя пользователя и пароль. В SCOM вам просто необходимо указать под какой учетной записью будет выполняться этот сценарий. Можно использовать например доменную учетную запись, имеющую доступ к этому файлу по сети, или встроенные: NetworkService или System. В таком случае нужно будет делегировать доступ учетной записи того компьютера на котором выполняется сценарий.
    Впрочем это уже наверное в совсем другой раздел.
    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    Модератор
  • С поммощью WSH:
    http://msdn.microsoft.com/en-us/library/x23stk5t(VS.85).aspx
    В качестве filespeс задайте свою шару. Периодичность можно реализовать с помощью планировщика или цикл используйте в скрипте.


    Andrew Mishechkin
    23 августа 2009 г. 17:58