Ru-Board.club
← Вернуться в раздел «Microsoft Windows»

» Задачи на bat-файлах 8

Автор: ComradG
Дата сообщения: 31.07.2010 14:58
Xpomep
А как на счет %allusersprofile%? Это и есть All Users.
NIKZZZZ
О! Спасибо! Теперь не нужно париться с перебором букв дисков
*************************
Тут [more=код]using System;
using System.Globalization;

class DemoDateAndTime
{
[STAThread]
static void Main(string[] args)
{
DateTime now = DateTime.Now;

try
{
if (args[0] != null)
{
switch(args[0])
{
case "/?":
case "-?":
Console.WriteLine("\nСинтаксис: [-d | -t]");
Console.WriteLine(" -d - показать сегодняшнее число");
Console.WriteLine(" -t - показать текущее время");
Console.WriteLine(" -? - показать справку");
Console.WriteLine("По умолчанию, если не введен ни один из параметров, выводится и число и время.");
break;

case "/d":
case "-d":
Console.WriteLine("\n" + now.ToString("D", new CultureInfo("en-US")));
break;

case "/t":
case "-t":
Console.WriteLine("\n" + now.ToString("T", new CultureInfo("en-US")));
break;

default:
Console.WriteLine("Ошибка: неверный параметр. Используйте ключ /? для вывода справки.");
break;
}
}
}
catch (Exception)
{
Console.WriteLine("\n" + now.ToString("D", new CultureInfo("en-US")) +
" " + now.ToString("T", new CultureInfo("en-US")));
}
}
}[/more] программы на С#, которую я привожу для понимания того, откуда в последующих батниках берется app.exe (это название программы, что за тагом more). А вот [more=батники].

Код: @echo off
setlocal
for /f "tokens=1,2,3,4 delims=: " %%i in ('%~dp0app.exe /t') do (
set hour=%%i
set mins=%%j
set secs=%%k
set pora=%%l
)
if %pora% equ PM (
set /a hour=%hour%+12
goto:result
) else if %pora% equ AM (
if %hour% equ 12 set /a hour=%hour%-12
goto:result
)
if %hour% equ 12 goto:result
:result
echo %hour%:%mins%:%secs%
endlocal
exit /b
Автор: Mark_Titov
Дата сообщения: 31.07.2010 15:25
ComradG
Спасибо за подсказку, пишу так -


Код: tasklist /fi "windowtitle eq cmd.exe" 2>nul && GOTO :no_start 1>nul 2>nul
goto :start
Автор: ComradG
Дата сообщения: 31.07.2010 15:48
Mark_Titov
Извини, но я сегодня торможу сильно. Не windowtitle, а tasklist /fi "imagename eq cmd.exe". Вот.
Автор: Mark_Titov
Дата сообщения: 31.07.2010 15:55
ComradG
Спасибо.

Немного переделал -


Код: tasklist /fi "imagename eq cmd.exe" 1>nul 2>nul && exit 1>nul 2>nul
Автор: 01MDM
Дата сообщения: 31.07.2010 16:18
Mark_Titov
Батник будет в любом случае обнаруживать процесс cmd.exe, т.к. он сам его создает.
Автор: Mark_Titov
Дата сообщения: 31.07.2010 16:20

Цитата:
Mark_Titov
Батник будет в любом случае обнаруживать процесс cmd.exe, т.к. он сам его создает.


Вот и я про то же, а как решить эту проблему?
Можно как-нибудь прописать что бы он при обнаружении одного процесса cmd.exe запускался, а при двух - на выход шел?
Автор: Xpomep
Дата сообщения: 31.07.2010 16:26

Цитата:
%%allusersprofile%\Start Menu\Programs\Startup\


у меня получается в батнике так , ну и + команда на ребут , правильно ?
Автор: 01MDM
Дата сообщения: 31.07.2010 16:26
Mark_Titov

Цитата:
Можно как-нибудь прописать что бы он при обнаружении одного процесса cmd.exe запускался, а при двух - на выход шел?

Попробуй для батника задать заголовок:

Код:
@echo off

title mytitle
tasklist /fi "windowtitle ne mytitle" /fi "imagename eq cmd.exe" | findstr [0-9] && exit
pause
Автор: wolf0425
Дата сообщения: 31.07.2010 16:38
Mark_Titov держи код, который проверяет наличие ранее запущенной своей копии и если такая есть - выходит.

Код: wmic process where (name='cmd.exe') get commandline | find "\%~nx0" | more +1 | find "%~nx0" && exit 1
Автор: Mark_Titov
Дата сообщения: 31.07.2010 17:01
ComradG
01MDM
wolf0425
Спасибо огромное ребята! Очень выручили!
Благодарю! Вроде все работает...
Автор: wolf0425
Дата сообщения: 31.07.2010 17:10
Mark_Titov там только это... нестрогая проверка. В смысле при имени этого батника _start.cmd проверка выкинет и если обнаружится запущенный ранее firts_start.cmd
и случаи ручного запуска из консоли - не ловятся никак.
но мне просто незачем было писать более тщательно - главное было двойного запуска конкретного батника избежать, код упрощался под задачу.
как полечить первое - наверно можно подумать, в принципе даже подправил выше (но не проверял особо), лечить второе особого смысла не вижу.
Автор: Mark_Titov
Дата сообщения: 31.07.2010 19:18
wolf0425
Понятно, того что ты дал в полне хватает...
Спасибо.

Может подскажешь как можно на удаленном компе эти команды выполнить?

netstat
ipconfig
powercfg /QUERY


Так же как эту -


Код: tasklist -s \\server
Автор: wolf0425
Дата сообщения: 31.07.2010 19:47

Цитата:
Может подскажешь как можно на удаленном компе эти команды выполнить?
выполнять чего-то-там на удаленном компе умеет psexec.exe, ищешь в шапке, яндексе или у мелкомягких.


Цитата:
Так же как эту - tasklist -s \\server
эта команда выполняется на локальном компе, а не на удаленном.
она только умеет спрашивать указанный удаленный комп перед тем как тебе что-то написать.
И если хватает прав - исправно печатает, непонятно что у тебя за проблемы с ней.
Автор: ComradG
Дата сообщения: 31.07.2010 19:56
Описание psexec на русском и ссылка на загрузку.
wolf0425
Совсем ни во что не въезжаю. Можно ли как-то упростить мои вычисления постом выше дня недели? А то я совсем осовел (толко совет, решение не надо).
Автор: wolf0425
Дата сообщения: 31.07.2010 21:10
ComradG
Цитата:
Можно ли как-то упростить мои вычисления постом выше дня недели?
у тебя с русским начинаются проблемы - случайная перестановка слов, в результате бред.
да без понятия можно ли упростить, куда уж проще двух строк.
ты хоть потестировал на примерах - правильно считает то?

А то, что тебя за код подобный for /f "tokens=1,2,3 delims=." %%i in ('date /t')
в свое время обоснованно отчитывали - ты так и не осознал, по факту...

Автор: ComradG
Дата сообщения: 31.07.2010 22:32
wolf0425
Что к чему? Я тебя никак не пойму: что
Код: for /f "tokens=1,2,3 delims=." %%i in ('date /t') do (
set day=%%i
set mon=%%j
set yer=%%k
)
Автор: wolf0425
Дата сообщения: 31.07.2010 23:07

Цитата:
Что к чему? Я тебя никак не пойму: что Код: 'date /t' ни у кого таки не работает вовсе?
код то работает, только вот работает у части народа не так как у тебя, за что такой код несколько недолюбливают - он требует проверки программистом настроек той машины, на которой будет запущен. Ну или предупреждения юзера, что результат зависит от настроек компа.

и твой код точно неоправданно усложнен относительно тривиального
set /a _day = 1%date:~0,2% -100
set /a _mon = 1%date:~3,2% -100
set /a _yer = %date:~6,4%
который кроме рулеточного случая запуска в 23:59:59,99 работает/неработает примерно с тем же геморроем, что и выдергивание даты из for ... ('date /t')


Цитата:
И потом, я спрашивал относительно вычисления дня недели
ну вот про него я тебе и ответил, что упрощать две строки арифметики - попросту бессмысленно. если данный код работает правильно, то "оптимизированный" лучше работать точно не будет.

кстати сочетание set mon=%%j и (%mon%-3) например сегодня не работает никак, (т.е. вычислялка сегодня страшно матерится и дает неверный dow), что наверно говорит о качестве проверок вообще.

Добавлено:

Цитата:
В своих вычислениях я отталкивался от количества дней в году и начала ХХ века.
кстати не вижу где вычислялка учитывает то, что годы 1900 и 2100 - невисокосные. оно там точно есть? или способность правильно посчитать день недели какой-нибудь бородинской битвы в алгоритм не закладывалась специально?
Автор: 01MDM
Дата сообщения: 01.08.2010 06:39
ComradG,
В одной из предыдущих частей уже поднимался вопрос вычисления дня недели. Как текущего дня, так и по произвольной дате. [more=Например]

Код:
::
:: Определяем день недели из любой даты нашей эры. Формат даты dd.mm.yyyy
::

@echo off
setlocal
1>nul chcp 1251

set /p date="Дата: "

for /f "tokens=1-3 delims=." %%i in ("%date%") do (
    set "d=1%%i" & set "m=1%%j" & set "y=1%%k"
)
for %%i in (d m) do set /a %%i-=100
set /a y-=10000

:: Одинаковый день недели повторяется раз в 28 лет... Каждые 7 високосных циклов.

if %y% geq 2029 (set "step=-28,2001") else (set "step=28,2029")
for /l %%i in (%y%,%step%) do set "y=%%i"

for /f %%i in ('set /a y%%4') do if %%i==0 (set "feb=1") else (set "feb=0")
for /f "tokens=%m%" %%i in ("0 31 59 90 120 151 181 212 243 273 304 334") do set /a yd=%%i+d
if %m% gtr 2 set /a yd+=feb

set /a wd=(((y-2001)/4+(y-2001)*365)+yd)%%7+1

for /f "tokens=%wd%" %%i in ("Воскресенье Понедельник Вторник Среда Четверг Пятница Суббота") do echo %%i
1>nul chcp 866
Автор: lorents
Дата сообщения: 01.08.2010 10:30
Добрый день!
Подскажите, как сделать, чтобы bat-файл считывал информацию из ini-файла?
Автор: 01MDM
Дата сообщения: 01.08.2010 11:38
lorents
Наверное надо конкретизировать задачу, в общем случае как из простого текстового файла.
Другое дело если необходимо найти нужную секцию, и именно из нее взять значение нужного параметра.

В принципе можно вообще все значения ini-файла загнать в переменные и уже с ними работать.
Например test.ini:

Код:
[section 1]
param_1=1.1
param_2=1.2
param_3=1.3

[section 2]
param_1=2.1
param_2=2.2
param_3=2.3

[section 3]
param_1=3.1
param_2=3.2
param_3=3.3
Автор: zepterman
Дата сообщения: 01.08.2010 13:00
Помогите написать скрипт, который выполнял следующее: при отключении сеанса(на терминальном сервере), этот сеанс сразу же завершался.
Автор: ComradG
Дата сообщения: 01.08.2010 13:37
wolf0425
Эээ, чего-то ты опять распалился: все вычисления начинались с начала двадцатого века, то бишь 1901. Там проверка на високосные годы есть, но она там у меня через чур хитро закручена. Короче, вопрос закрыт, спасибо за критику.
01MDM
Круто придумано! Я этот пример как-то просмотрел, спасибо
Автор: lorents
Дата сообщения: 01.08.2010 16:44
01MDM
именно то что надо, спасибо!
и еще один вопрос, как можно изменить дата/время создания, изменения файлов, через командную строку, может есть программа?
Автор: cin
Дата сообщения: 01.08.2010 17:03
Господа, как скопировать файл из одной папки в другую, если нет, то создать?
Необходимо предусмотреть все возможные варианты. например пробелы в пути до искомого, русские символы и т.п.

пока мись с помощью xcopy не удалось
Автор: us0r
Дата сообщения: 01.08.2010 17:04
zepterman
А нафиг скрипт? Ты в политиках deadline настрой и радуйся... Там может не сразу (не помню точно), но после минуты- пяти сервак сам закиляет сессию...
А со скриптом сложнее...

Добавлено:
cin
Пути в ручную писать будешь...

Код: @echo off
cls
setlocal
set /p source="What:"
set /p destination="Where:"
xcopy "%source%" "%destination%" /L /G /H /O /Y /Z
endlocal
Автор: lorents
Дата сообщения: 01.08.2010 22:21
Добрый вечер!
Помогите, пожалуйста решить следующую задачу:
у меня есть файл config.ini

Цитата:
[JPEG]
; Удаление метаданных.
; Если Вы хотите не удалять определенные метаданные, то замените значение "true" на "false" там, где это необходимо.
dc = true    ;Delete comment field (as left by progs like Photoshop & Compupic)
de = true    ;Strip Exif section (smaller JPEG file, but lose digicam info)
di = true    ;Delete IPTC section (from Photoshop, or Picasa)
dx = true    ;Deletex XMP section
du = true    ;Delete non image sections except for Exif and comment sections

А в моем bat-файле

Код: "%~dp0Docs\jhead.exe" -dc -de -di -dx -du "%%~fi"
Автор: wolf0425
Дата сообщения: 01.08.2010 23:24
lorents разбор секций инишника мне писать точно лень, а вот на переменные которые true выдрать - несложно:

Код: set "_keys="
for /f "tokens=1,2 delims=;= " %%a in (config.ini) do if /i .%%b equ .true call set "_keys=%%_keys%% -%%a"
"%~dp0Docs\jhead.exe" %_keys% "%%~fi"
Автор: cin
Дата сообщения: 02.08.2010 11:08
Еще вопрос.
Я пишу скрипт, в котором есть необходимость создать шару, в зависимости от того где находится папка с дистрибутивами.
проблема в том что на некоторых компах дистрибы лежат на c:\ на каких-то на d:\
НА некоторых компа диска d: нет. где то вместо d:\ - стоит дивиди.

Как определить что диск d есть я догадался
IF EXIST D: (set share_drive=d) else set share_drive=c

Проблема возникает, если диск D - не жесткий диск, а например флеха или дивиди.
Как с помощью cmd вытащить инфу 100% чем является диск d:\

Спасибо
Автор: lorents
Дата сообщения: 02.08.2010 11:13
wolf0425
Большое Спасибо! Осталось разобраться в секциях
Автор: wolf0425
Дата сообщения: 02.08.2010 11:20
cin
Цитата:
Как с помощью cmd вытащить инфу 100% чем является диск d:\

fsutil.exe fsinfo drivetype d:\


Добавлено:
lorents
Цитата:
Осталось разобраться в секциях
А нафига? заняться больше нечем?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132

Предыдущая тема: XP не видит второй раздел на съемном USB-HDD


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.