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

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

Автор: igor_andreev
Дата сообщения: 25.01.2007 11:13
Elroir
А вы его с evgeni666 собственно почти и воспроизвели на этой странице, ход мыслей тот же
Мне почему-то правда в голову не пришло
for /f "tokens=1,2" %%a in ("%date%") do (
if "%%b"=="" set show_day_of_week=no
)
я в том батнике проверял, является ли первый знак от DATE /T цифрой...
Автор: evgeni666
Дата сообщения: 25.01.2007 11:32
Вычислил, когда есть день недели, а когда нет.
Если формат представления дня 'd' - то дата выводится без лидирующего нуля, но с выводом дня недели (причем в документации этого нет).
Вот кусочек из хелпа по этому поводу.

Отображение чисел без вывода нулей в начале числа | Введите один символ. Введите d для указания дня, y — для года и M — для месяца
Вывод нулей в начале чисел, состоящих из одной цифры | Введите два символа. Введите dd для указания дня, yy — для года и MM — для месяца
Вывод двух последних цифр года | Введите yy для указания года
Вывод четырех цифр года | Введите yyyy для указания года
Вывод сокращений дня недели или месяца | Введите три символа. Введите ddd для указания дня и MMM — для указания месяца
Вывод полного названия дня недели или месяца | Введите четыре символа. Введите dddd для указания дня и MMMM — для указания месяца
Вывод дополнительного текста Заключите текст в апострофы (')
Автор: Elroir
Дата сообщения: 25.01.2007 11:51
evgeni666

Цитата:
Вычислил, когда есть день недели, а когда нет.

То есть теперь надо перебрать все варианты d,m,y как в коде igor_andreev-а и, в зависимости от того, какой вариант совпадает с sShortDate, вытащить дату.
Автор: evgeni666
Дата сообщения: 25.01.2007 11:52
igor_andreev
Твой батник заточен под использование стандартных значений представления короткой даты. Это как раз и есть 98% стандартного использования, но все одно - не универсально

Если свободное время будет, то попробую сегодня нарисовать универсальную процедуру вычисления даты.

PS. Попутно процедура
for /f "tokens=1,2" %%a in ("%date%") do if "%%b"=="" (set mydate=%%a) else (set mydate=%%b)
вычищает дату от дня недели. на выходе остоется только дата.

Добавлено:
Elroir
не надо перебирать варианты. а уже имею в виде отдельных переменных дату, месяц, день и их форматы - надо только сопоставить их. Код получится более универсальным.
Автор: Elroir
Дата сообщения: 25.01.2007 12:08
evgeni666

Цитата:
Код получится более универсальным.

ОК. Только нельзя использовать утилиту "reg.exe". В стандартной поставке Win2000, ее нет.
Автор: igor_andreev
Дата сообщения: 25.01.2007 12:24
evgeni666

Цитата:
Если формат представления дня 'd' - то дата выводится без лидирующего нуля, но с выводом дня недели (причем в документации этого нет).

О спасибо, не знал этого.

Цитата:
Твой батник заточен под использование стандартных значений представления короткой даты. Это как раз и есть 98% стандартного использования, но все одно - не универсально

А оставшиеся 2% - если уж изменили вывод даты, то знают зачем это сделали, не задают на форумах вопросов типа "как мне создать папку с названием сегодняшней даты" и наверняка сами смогут вывести в батнике или скрипте удобоваримую для себя форму записи даты
Автор: evgeni666
Дата сообщения: 25.01.2007 12:35
Elroir

Цитата:
ОК. Только нельзя использовать утилиту "reg.exe". В стандартной поставке Win2000, ее нет.

От блин, забыл про это. Фикня вопрос - выгрузим ветку реестра во временный файл

А вот и готовое решение

Получаем текущую дату в независимости от региональных настроек.
Работает для XP и выше.


Цитата:

for /f "skip=2 tokens=2*" %%i in ('reg QUERY "HKCU\Control Panel\International" /v sDate') do set sdate=%%j
for /f "skip=2 tokens=2*" %%i in ('reg QUERY "HKCU\Control Panel\International" /v sShortDate') do set sshortdate=%%j
for /f "delims=%sdate% tokens=1,2,3" %%i in ("%sShortDate%") do set /a f1=%%i & set /a f2=%%j & set /a f3=%%k
for /f "tokens=1,2" %%i in ("%date%") do if "%%j"=="" (set mydate=%%i) else (set mydate=%%j)
for /f "delims=%sdate% tokens=1,2,3" %%i in ("%mydate%") do set d1=%%i & set d2=%%j & set d3=%%k
if "%f1%"=="yy" if %d1% GEQ 30 (set d1=19%d1%) else (set d1=20%d1%)
if "%f1%"=="y" if %d1% GEQ 30 (set d1=19%d1%) else if %d1% GEQ 10 (set d1=20%d1%) else (set d1=200%d1%)
if "%f2%"=="yy" if %d2% GEQ 30 (set d2=19%d2%) else (set d2=20%d2%)
if "%f2%"=="y" if %d2% GEQ 30 (set d2=19%d2%) else if %d2% GEQ 10 (set d2=20%d2%) else (set d2=200%d2%)
if "%f3%"=="yy" if %d3% GEQ 30 (set d3=19%d3%) else (set d3=20%d3%)
if "%f3%"=="y" if %d3% GEQ 30 (set d3=19%d3%) else if %d3% GEQ 10 (set d3=20%d3%) else (set d3=20%d3%)
if "%f1:~0,1%"=="y" (set year=%d1%) else if "%f2:~0,1%"=="y" (set year=%d2%) else if "%f3:~0,1%"=="y" (set year=%d3%)
if "%f1:~0,1%"=="M" (set month=%d1%) else if "%f2:~0,1%"=="M" (set month=%d2%) else if "%f3:~0,1%"=="M" (set month=%d3%)
if "%f1:~0,1%"=="d" (set day=%d1%) else if "%f2:~0,1%"=="d" (set day=%d2%) else if "%f3:~0,1%"=="d" (set day=%d3%)

echo %year%
echo %month%
echo %day%


PS. Код для 2000-го будет чуть позже.
Автор: regular
Дата сообщения: 25.01.2007 14:05
Скажите, пожалуйста, как можно в одном текстовом файле подменить слова согласно словарю в виде другого файла. Подменять нужно только те слова которые есть в этом словаре. Разделитель слов в словаре -вертикальная черта "|"
Автор: Elroir
Дата сообщения: 25.01.2007 15:43
regular
Я предположил, что каждая пара слов в словаре идет на отдельной строке. Иначе следующий код будет работать не верно.

Код:
@echo off
setlocal
set dictionary=dict.txt
copy /y "%~1" "%~n1.bak">nul

::sbs2.com creation
:: Create the assembler program, by Herbert Kleebauer
echo Bj@jzh`0X-`/PPPPPPa(DE(DM(DO(Dh(Ls(Lu(LX(LeZRR]EEEUYRX2Dx=> %temp%.\sbs2.com
echo 0DxFP,0Xx.t0P,=XtGsB4o@$?PIyU!WvX0GwUY Wv;ovBX2Gv0ExGIuht6>> %temp%.\sbs2.com
echo ?@}IKuNWpe~Fpe?FNHlF?wGMECIQqo{Ox{T?kPv@jeoSeIlRFD@{AyEKj@>> %temp%.\sbs2.com
echo iqe~1NeAyR?mHAG~BGRgB{~H?o~TsdgCYqe?HR~upkpBG?~slJBCyA?@xA>> %temp%.\sbs2.com
echo LZp{xq`Cs?H[C_vHDyB?Hos@QslFA@wQ~~x}viH}`LYNBGyA?@xAB?sUq`>> %temp%.\sbs2.com
echo LRy@PwtCYQEuFK@A~BxPtDss@fFqjVmzD@qBEOEenU?`eHHeBCMs?FExep>> %temp%.\sbs2.com
echo LHsPBGyA?@xAunjzA}EKNs@CA?wQpQpKLBHv?s`WJ`LRCYyIWMJaejCksl>> %temp%.\sbs2.com
echo H[GyFGhHBwHZjjHeoFasuFUJeHeB?OsQH[xeHCPvqFj@oq@eNc?~}Nu??O>> %temp%.\sbs2.com
echo ~oEwoAjBKs?Zp`LBzHQzyEFrAWAG{EFrAqAGYwHTECIQ{coKIsaCsf{Oe~>> %temp%.\sbs2.com
echo CK}Ayre~CNFA{rAyEKFACrA{EKGAjbA}eKGSjNMtQFtc{OAyDGFj?{FDGQ>> %temp%.\sbs2.com
echo KAjNVk_OCAx@e?f{o?CosI}1EGizhljJ~H1ZeG}JBA~rACBMDGjjDG@g0>> %temp%.\sbs2.com

for /f "tokens=1,2 delims=^| " %%a in (%dictionary%) do (
:: Use the program
%temp%.\sbs2.com 0 "%%a" "%%b" < "%~1" > "tmp_%~1"
copy /y "tmp_%~1" "%~1">nul
del "tmp_%~1"
)
:: Delete the program
del %temp%.\sbs2.com
Автор: Nagual
Дата сообщения: 25.01.2007 16:31
задача:

есть папка folder и папка folder_ или folder__
лежат они рядом
необходимо следующее:
1) при наличии папки folder_ переименовать папку folder в folder__ и папку folder_ в папку folder
2) при наличии папки folder__ переименовать папку folder в folder_ и папку folder__ в папку folder

делаю так
Код: if exist folder__ (
ren folder folder_
ren folder__ folder
)

if exist folder_ (
ren folder folder__
ren folder_ folder
)
Автор: Elroir
Дата сообщения: 25.01.2007 17:01
Nagual

Цитата:
разобрался сам

А я смотрю на код (первый) и не понимаю что ты делаешь - ты же их по кругу гонял
Автор: regular
Дата сообщения: 25.01.2007 17:48
Elroir,
с учетом, что у меня существует словарь "dict.txt" и сам файл для обработки "1.cvs" опираясь на твою программу, свой скрипт "c:\repl.bat" я записал так:

Код:
@echo off
setlocal
set dictionary=c:\dict.txt
copy /y "%~1" "%~n1.bak">nul
for /f "tokens=1,2 delims=^| " %%a in (%dictionary%) do (
:: Use the program
c:\1.cvs 0 "%%a" "%%b" < "%~1" > "tmp_%~1"
copy /y "tmp_%~1" "%~1">nul
del "tmp_%~1"
)
Автор: Elroir
Дата сообщения: 25.01.2007 20:11
regular
Для замены слов в тексте, используется программка sbs2.com, которая создается самим батником в temp директорие, а после работы уничтожается.

Код: %temp%.\sbs2.com 0 "%%a" "%%b" < "%~1" > "tmp_%~1"
Автор: regular
Дата сообщения: 25.01.2007 23:59
sorry, Elroir
Я думал sbs2.com, это тестовый файл в котором и будем делать замены...
Автор: Kac
Дата сообщения: 26.01.2007 05:11
Суток доброе время!
Еще буду рытся но пока не нашел.
1. Необходимо изменить переменные окружения в Вин 2000 сервер и Вин 2003 сервер таким образом чтобы после перезагрузки они сохранились и сохранялись не только на текущий сеанс (приложение) а на все последующие открытые...

Пример запускаю БАТник, в нем
set VAR1=Bla-Bla

set TMP=%systemdir%\TMP
set TEMP=%systemdir%\TMP

set path=c:\;%path%

Не получилось никак сохранить это.. при открытии нового окна все переменные окружения старые не говоря уже о перезагрузки...
Пытался даже батником в реестре менять

Спасибо
Автор: ViSiToR
Дата сообщения: 26.01.2007 07:42
Kac

Цитата:
Необходимо изменить переменные окружения

Для сохранения переменных используется реестер, если нужно создать постоянную переменную окружения, то нужно писать в реестер:

Для добавления в Path...


Код: Reg Add "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d "C:\;%Path%" /f
Автор: igor_andreev
Дата сообщения: 26.01.2007 07:44
Kac
setenv.exe http://barnyard.syr.edu/~vefatica/#SETENV
editpath.exe(epath2.zip) http://internet.cybermesa.com/~bstewart/misctools.html
setx.exe из любого набора Resource Kit для NT,2000,XP. Эта например http://download.microsoft.com/download/win2000platform/setx/1.00.0.1/nt5/en-us/setx_setup.exe
Автор: ViSiToR
Дата сообщения: 26.01.2007 08:13
Обновил шапку:

В Полезные ссылки:
Справка по командам в виде Html

В Готовые решения и частые вопросы:

Установка задержки (паузы) в батнике
Создание (запись) переменных окружения в реестр
Конвертирование файлов (*.com *.exe *.*) в код батника
Автор: freedom83
Дата сообщения: 26.01.2007 09:52
народ, ГОРЮ
написал программу на дельфи которая перемещает файлы *.txt из одной папки в другую, если их дата не равна текущей. но шеф хочет чтобы был написан батник, помогите кто чем может
Автор: evgeni666
Дата сообщения: 26.01.2007 10:00
ViSiToR
Тогда уж поправь пример вычисления предыдущей даты на более правильную
Вот эту http://forum.ru-board.com/topic.cgi?forum=62&bm=1&topic=9040&start=647&limit=1
Автор: freedom83
Дата сообщения: 26.01.2007 10:12
народ, такое вообще возможно в батнике реализовать?
если нет, аргументируйте пожалуйста, СРОЧНО
Автор: Kac
Дата сообщения: 26.01.2007 10:18
Спасибо человеческое всем ответившим!
2 часа назад сам допер до setX (вернее разрыл на этом форуме)
От себя хочу добавить... эта утилка уже идет в 2003 и токо для 2000 пришлось ее с 2003го списывать.
Все заработало. Про реестр умно! взял на заметку.
Автор: uZver
Дата сообщения: 26.01.2007 10:21
freedom83
xcopy /?
/D:m-d-y Копирует файлы, измененные либо в указанный день, либо после.
Если дата не указана, копируются только те файлы,
которые новее в исходной папке.
Автор: Elroir
Дата сообщения: 26.01.2007 10:23
freedom83
Возможно. Запусти следующий батник, дай ему в качестве аргумента какой-нибудь файл и выложи результат.

Код:
@echo off
echo %date%
echo %~t1
Автор: freedom83
Дата сообщения: 26.01.2007 10:39
Elroir
26,01,2007
18,01,2007 16,37
Автор: Elroir
Дата сообщения: 26.01.2007 10:51
freedom83
Только одна строчка? Там должно было быть две...
Ну ладно, попробуем так:

Код:
@echo off
setlocal enabledelayedexpansion
set source=c:\dir1\
set dest=c:\dir2\
set cdate=%date:,=%
for %%a in (%source%*.txt) do (
set fdate=%%~ta
set fdate=!fdate:~0,10!
set fdate=!fdate:,=!
if not !fdate!==!cdate! move "%source%%%a" %dest%
)
Автор: freedom83
Дата сообщения: 26.01.2007 10:59
Elroir
отработало, но ничего не переместилось

Добавлено:
пробелы в конце удалил,
Автор: ViSiToR
Дата сообщения: 26.01.2007 11:07
evgeni666

Цитата:
поправь пример вычисления предыдущей даты на более правильную

Поправить? а какой пример? как называется в шапке? или добавить новый? вообще-то шапку может править каждый ...


Цитата:
Внимание! Ты можешь отредактировать это сообщение, если у тебя есть новая информация по этой теме! Подробнее..


Могу и я, но я не совсем понял что там праит/добавлять

Добавлено:
freedom83
Попробуй так:


Код: setlocal enabledelayedexpansion
set source=c:\source\
set dest=c:\dest\
set cdate=%date:,=%
for %%a in (%source%*.txt) do (
set fdate=%%~ta
set fdate=!fdate:~0,10!
set fdate=!fdate:,=!
if not !fdate!==!cdate! move "%source%*.txt" %dest%
)
Автор: evgeni666
Дата сообщения: 26.01.2007 11:36
ViSiToR
Попробовал поменять шапку. получил отлуп
Неправильный пароль или имя пользователя, либо Вы не автор этого сообщения


Можешь добавить такую строчку?

· Использование даты на день раньше чем сегодня (Вариант, учитывающий високосные года)
Автор: ViSiToR
Дата сообщения: 26.01.2007 11:51

Цитата:
Можешь добавить такую строчку?

Добавил




Давно написал батник, который добавляет в реестер запись, позволяющая создавать батники из контекстного меню обозревателя (Прав. Кнопкой мышки - > Создать) -
К батнику также прилагается иконка, которую можно установить (перед установкой иконки выводится запрос на подтверждение), а также прилагается небольшая утилита для организования цвета шрифта в батнике (очень красиво получается).

[more=Вот код]@echo off
goto first
:again
cls
col 12
echo Please insure that you type 'EXIT', 'NO' or 'YES', and try again
ping -n 5 localhost > nul
cls
:first
col 14
echo Are you shure?
echo This will create Registry entrie,
echo for creating a New BATH file!
echo.
col 10
echo If you Not agree, please type 'EXIT', if you do want to install this,
echo then type 'YES', and at the end press ENTER:
col 15
echo --------------------------------------------
echo.
col 10
Set /p AskFirst=
if /i %AskFirst%==no goto end
if /i %AskFirst%==exit goto end
if /i not %AskFirst%==yes goto again
cls
echo If you do not want to change the icon of
echo Bath files, type 'NO', if you do want,
echo then type 'YES', and at the end press ENTER
echo Or type 'EXIT' to Quit the program!
col 15
echo --------------------------------------------
echo.
col 10
Set /p AskIcon=
if /i %AskIcon%==no goto skip
if /i %AskIcon%==exit goto end
if /i Not %AskIcon%==yes (goto again) else (
copy /y batnik.ico %systemroot%\batnik.ico
REG ADD "HKCR\batfile\DefaultIcon" /ve /t REG_SZ /d %%SystemRoot%%\batnik.ico /f
)
:skip
if not exist %windir%\SHELLNEW md %windir%\SHELLNEW
echo @echo off> %windir%\SHELLNEW\BATHiK.bat
REG ADD "HKCR\batfile" /ve /t REG_SZ /d BATHiK /f
REG ADD "HKCR\.bat\ShellNew" /v FileName /t REG_SZ /d BATHiK.bat /f
:end[/more]

А вот ссылка на скачку всего “установщика” (без этих файлов код нужно править, и видоизменять).

Добавлено:
P.S
Результат будет виден после повторного открытия меню “Создать”

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Сбой активации XP sp2


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