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

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

Автор: mugil_cephalus
Дата сообщения: 24.10.2009 22:34
VisioNRU
класс! а у меня всего один com
Автор: mouser
Дата сообщения: 24.10.2009 22:55
есть большое количество раскиданных по папкам директории типа -= DIR =-
где они находятся и вложенность в каталогах не известна

задача: нужно чтоб папки типа -= DIR =- найти автоматом и переименовать в ! DIR

на чём это можно сделать и как не представляю (давно не лазил в подобные дебри)

Добавлено:
нужен лог переименованных каталогов
Автор: mugil_cephalus
Дата сообщения: 25.10.2009 00:02
VisioNRU
если ты плохо разбираешся в батниках, то придется подождать пока кто-нибудь из профи напишет
я попытался кое-что сварганить, пока получилось (если я правильно составил скрипт, если неверно - пусть кто-нить поправит):

@echo off
setlocal enabledelayedexpansion
set sn=1
for /f "tokens=* delims=, usebackq" %%A in (`mode ^| find /i "COM?"`) do call :find %%A
goto :eof

:find
if /i "%1" equ "COM!sn!" (echo Match) else (goto notMatch)
set /a sn+=1
goto :eof

:notMatch

если ты силен в батниках - то хорошо, может доделаешь и/или поправишь
у меня загвоздка в
Цитата:
если она не по порядку то переименовать в com1, com2 и тд.
- насколько я понимаю, нужно же сначала узнать самый бОльший номер, допустим он будет 3 (хотя я плохо представляю сколько может быть портов помаксимуму), а затем, если порты идут так: 3 1 2 - то 3-ий переименовать в 4-ый, а тому, что было 3-ий присвоить имя 1-ый

у меня так
F:\Documents and Settings\admin>mode

Состояние устройства LPT1:
---------------------------
Вывод принтера не переадресован.


Состояние устройства COM1:
---------------------------
Скорость: 1200
Четность: None
Биты данных: 7
Стоповые биты: 1
Таймаут: OFF
XON/XOFF: OFF
Синхронизация CTS: OFF
Синхронизация DSR: OFF
Чувствительность DSR: OFF
Цепь DTR: ON
Цепь RTS: ON


Состояние устройства CON:
--------------------------
Строки: 300
Столбцы: 145
Скорость клавиатуры: 31
Задержка клавиатуры: 1
Кодовая страница: 866
Автор: king_stiven
Дата сообщения: 25.10.2009 03:23
mouser

Код: @echo off
for %%i in (q w e r t y u i o p a s d f g h j k l z x c v b n m ) do (
if exist "%%i:\-= DIR =-" (
REN "%%i:\-= DIR =-" "! DIR" && echo %%i:\-= DIR =- переименован в %%i:\! DIR >> 1.txt || echo %%i:\-= DIR =- найден но не переименован >> 1.txt
)
for /f "tokens=*" %%k in ('dir /b /s /a:d "%%i:\-= DIR =-" 2^>nul') do (
REN "%%k" "! DIR" && echo %%k переименован в %%~dpk! DIR >> 1.txt || echo %%k найден но не переименован >> 1.txt
)
)
Автор: VisioNRU
Дата сообщения: 25.10.2009 09:17

Цитата:
mugil_cephalus


спасибо.. это уже что-то.


Добавлено:
2 mugil_cephalus

com портов может быть от 4 до 8 в моём случае.
нет необходимости искать самый больший..
проблема вот в чем после установки XP один из com портов (4) обзывается почему то 5.
так вот.. необходимо что то типа проверки на последовательность 1,2,3,4,5 и если после 3 идёт сразу 5, то переименовать 5 в 4.
Автор: mugil_cephalus
Дата сообщения: 25.10.2009 10:12
VisioNRU

Цитата:
com портов может быть от 4 до 8 в моём случае.
нет необходимости искать самый больший..
проблема вот в чем после установки XP один из com портов (4) обзывается почему то 5.
так вот.. необходимо что то типа проверки на последовательность 1,2,3,4,5 и если после 3 идёт сразу 5, то переименовать 5 в 4.


я с программой mode плохо знаком (в win XP она - mode COM - мне как-то и не требовалась), но, насколько я понял, mode может только настраивать COM-порты, а не переименовывать
тут или в реестре нужно смотреть
вообще у меня на сис блоке 3 или 4 COM'a, но подключен только один - там сидит ИБП
чтоб win xp (голая, сразу после инсталляции) так путала - тут, наверное, дело в железе (в подключении перемычек на мат. плате) или в конфликте внешнего оборудования или драйверы

Добавлено:
VisioNRU

Цитата:
и если после 3 идёт сразу 5, то переименовать 5 в 4.

а дальше - (после 5-ти) - 4-ре не может встретиться? 4 вообще отсутствуеот? - то есть один порт под номером X вообще может отсутствовать или он есть в списке, но не последовательно:
1 2 3 5 6 7 4 8 ??

Добавлено:
VisioNRU
нашел 1 ошибку в скрипте - см. в %systemdrive%\WINDOWS\Help\ntcmds.chm - find :
FindПоиск заданной строки текста в файле или нескольких файлах. После поиска в заданных файлах команда find выведет на экран все строки из этих файлов, содержащие заданный образец.
..............
Использование подстановочных знаков
Подстановочные знаки (* и ?) не могут быть использованы в именах файлов и расширениях, задаваемых в команде find. Чтобы искать строку в множестве файлов, указанных с помощью подстановочных знаков, можно использовать команду find в команде for.

очевидно в -
Цитата:
mode ^| find /i "COM?"
find "путает" com-порт с *.com-файлом - правильно так: mode ^| find /i "COM"
Автор: mouser
Дата сообщения: 25.10.2009 13:34
king_stiven
спасибо ... только слово DIR оно разное ... тоесть папки у меня могут быть
-= ваыргва =-
-= fhd =-
-= j8f6g =-
и т.д.
Автор: king_stiven
Дата сообщения: 25.10.2009 13:41
mouser
сообразишь я думаю
Автор: mugil_cephalus
Дата сообщения: 25.10.2009 13:57
VisioNRU
я сам скрипт еще подкорректирую - он пока еще сырой и сбойный (может мастера еще помогут; я скрипт погонял несколько раз - вижу ошибки - подправлю) - но что делать с
Цитата:
так вот.. необходимо что то типа проверки на последовательность 1,2,3,4,5 и если после 3 идёт сразу 5, то переименовать 5 в 4.
- пока ума не приложу

P.S.
хотя с проверкой еще представляю, а вот
Цитата:
то переименовать 5 в 4.
Автор: mouser
Дата сообщения: 25.10.2009 14:20
king_stiven
без руля ... знаю что в sql выглядить like "-= %"
а тут не помню либо не знаю (((
Автор: mugil_cephalus
Дата сообщения: 25.10.2009 16:50
VisioNRU
вот подправленный скрипт для первой части твоей задачи:

@echo off
echo on
rem Description: test script for codepage=866 & single COM-port
setlocal enabledelayedexpansion
set sn=1
for /f "tokens=* usebackq" %%A in (`mode ^| find /i "COM"`) do call :find %%A
goto :eof

:find
echo test_!sn!_
echo test_%3_
set "var1=%3"
set "var2=!var1:~0,-1!"
echo test_!var2!_
if /i "!var2!" equ "COM!sn!" (echo Match) else (goto notMatch)
set /a sn+=1
goto :eof

:notMatch
echo notMatch

ВОТ OUTPUT:

G:\scripts>rem Description: test script for codepage=866 & single COM-port

G:\scripts>setlocal enabledelayedexpansion

G:\scripts>set sn=1

G:\scripts>for /F "tokens=* usebackq" %A in (`mode | find /i "COM"`) do call :find %A

G:\scripts>call :find Состояние устройства COM1:

G:\scripts>echo test_!sn!_
test_1_

G:\scripts>echo test_COM1:_
test_COM1:_

G:\scripts>set "var1=COM1:"

G:\scripts>set "var2=!var1:~0,-1!"

G:\scripts>echo test_!var2!_
test_COM1_

G:\scripts>if /I "!var2!" EQU "COM!sn!" (echo Match ) else (goto notMatch )
Match

G:\scripts>set /a sn+=1

G:\scripts>goto :eof

G:\scripts>goto :eof

G:\scripts>


так как у меня: Состояние устройства COM1: А если у тебя (вернее, твоих конечных пользователей,
по-английски): Status for device con:


Цитата:
Status for device con:
-------------------------
Lines: 300
Columns: 80
Keyboard rate: 31
Keyboard delay: 1
codepage: 866


то тебе в скрипте нужно %3 заменить везде на %4 (ну и test-строки поудалять....)
Автор: VisioNRU
Дата сообщения: 25.10.2009 20:40
винда просто embedded.
Автор: mugil_cephalus
Дата сообщения: 25.10.2009 23:32
VisioNRU

"железно" у меня (workstation, старая) 3 или 4 COM-порта, СОМ-кабель подключен только к одному (что и показывает mode -
Цитата:
Состояние устройства COM1:
), посмотрел в GUI - можно задать до 256 номеров COM-порта: от COM1, COM2 до COM256. В реестре я не силен, но, ИМХО, если
Цитата:
проблема вот в чем после установки XP один из com портов (4) обзывается почему то 5.
так вот.. необходимо что то типа проверки на последовательность 1,2,3,4,5 и если после 3 идёт сразу 5, то переименовать 5 в 4.

то это должно отражаться в:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM]
"\\Device\\Serial0"="COM1"
"\\Device\\Serial1"="COM2"

Вообще, наверняка, на http://forum.ru-board.com/ есть топик по реестру - там уж точно знают, где что.
смотри в сторону реестра и команд командной строки для работы с реестром, например - reg add:

.............
:notMatch
reg add HKLM\HARDWARE\DEVICEMAP\SERIALCOMM /v \Device\Serial0 /t REG_SZ /d COM1 /f
и т.д. (что-то такое, проверь синтаксис, здесь - Задачи на bat-файлах - на форуме есть примеры использования синтаксиса reg add)
Автор: Holytop
Дата сообщения: 25.10.2009 23:45
spam
Автор: king_stiven
Дата сообщения: 26.10.2009 09:17
Вопрос по sedу.
1 Нужно вставить 5 строчку файла 1.txt на 10 строчку файла 2.txt имеющего 20 строчек, а строки с 10 по 20 строчку файла 2.txt соответственно переходят на 11 по 21 строчку.
Автор: Joo1z
Дата сообщения: 26.10.2009 09:40
king_stiven
А что мешает скинуть первые 10 строчек из 2.txt в 3.txt, потом туда добавить 5-ю строчку из 1.txt в конец 3.txt, а потом в конец же натолкать остаток из 2.txt, после чего просто переименовать?
Автор: mouser
Дата сообщения: 26.10.2009 09:47
king_stiven
плз ответь !!!
я не знаю что за параметр вставить чтоб переименовывал любые каталоги
Автор: Joo1z
Дата сообщения: 26.10.2009 09:53
mouser
Тогда вместо DIR впиши * и произойдет чудо.
Автор: king_stiven
Дата сообщения: 26.10.2009 10:23
Joo1z
У седа наверняка всё это есть одной командой
mouser
сначала приведи все возможные имена, и на какое поменять надо, есть ли там пробелы и знаки важно
Автор: mouser
Дата сообщения: 26.10.2009 10:34
Joo1z
да, но он не понимает что то что он нашёл к примеру -= dfuihggd =- нужно переименовать в ! dfuihggd, а не в ! DIR

Добавлено:
king_stiven
так это мне нужно будет знать заранее как у меня могут называться директории ??? ОБЛОМ ((
Автор: Joo1z
Дата сообщения: 26.10.2009 10:57
king_stiven
Честно говоря, не работал в SED с двумя файлами сразу или по крайней мере не помню этого. IMHO там нужно будет углубляться в глубины REGEXP, а оно надо, если можно проще?

Добавлено:
mouser
если все папки начинаются на -= и заканчиваются на =-, то
set %newname%=! %oldname:~2,-2%
ren "%dirname%" "%newname%"
Автор: mouser
Дата сообщения: 26.10.2009 11:56
Joo1z
у меня не выходит .... впихнуть в цикл который был предложен ранее
Автор: Joo1z
Дата сообщения: 26.10.2009 12:35
mouser
Если тебе действительно нужен ! вначале имени файла, то тут проблемы.
Можно, правда, обойти созданием 2х файлов со списком папок: в одном исходные, во втором - желаемые.
Автор: mouser
Дата сообщения: 26.10.2009 13:17
Joo1z
пойду руками делать )))
Автор: king_stiven
Дата сообщения: 26.10.2009 16:02
mouser

Код: @echo off
chcp 1251 > nul
for %%i in (q w e r t y u i o p a s d f g h j k l z x c v b n m ) do (
if exist "%%i:\-=*=-" (
for /D %%e in ("%%i:\-=*=-") do (
for /f "tokens=2 delims==" %%f in ("%%e") do (
REN "%%e" "!%%f" && echo %%e переименован в !%%f >> 1.txt || echo %%e найден но не переименован >> 1.txt
)
)
)
for /f "tokens=*" %%k in ('dir /b /s /a:d "%%i:\-=*=-" 2^>nul') do (
for /f "tokens=2 delims==" %%f in ("%%~nxk") do (
REN "%%k" "!%%f" && echo %%k переименован в !%%f >> 1.txt || echo %%k найден но не переименован >> 1.txt
)
)
)
Автор: llanowar
Дата сообщения: 26.10.2009 18:00
Подскажите, как узнать имя текущего залогиненного пользователя на компе по сети?
пробовал через psexec.exe <комп> -с 1.cmd , где 1.cmd одержит echo %username%, но все время получаю свое имя пользователя. Какие есть варианты?
Автор: VisioNRU
Дата сообщения: 26.10.2009 19:38

Цитата:
[/q]
[q]VisioNRU
 
"железно" у меня (workstation, старая) 3 или 4 COM-порта, СОМ-кабель подключен только к одному (что и показывает mode -
Цитата:
Состояние устройства COM1:
), посмотрел в GUI - можно задать до 256 номеров COM-порта: от COM1, COM2 до COM256. В реестре я не силен, но, ИМХО, если
Цитата:
проблема вот в чем после установки XP один из com портов (4) обзывается почему то 5.  
так вот.. необходимо что то типа проверки на  последовательность 1,2,3,4,5 и если после 3 идёт сразу 5, то переименовать 5 в 4.

то это должно отражаться в:
Windows Registry Editor Version 5.00
 
[HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM]
"\\Device\\Serial0"="COM1"
"\\Device\\Serial1"="COM2"
 
Вообще, наверняка, на http://forum.ru-board.com/ есть топик по реестру - там уж точно знают, где что.
смотри в сторону реестра и команд командной строки для работы с реестром, например - reg add:
 
.............
:notMatch
reg add HKLM\HARDWARE\DEVICEMAP\SERIALCOMM /v \Device\Serial0 /t REG_SZ /d COM1 /f
и т.д. (что-то такое, проверь синтаксис, здесь - Задачи на bat-файлах - на форуме есть примеры использования синтаксиса reg add)

огромный thanx... с реестром знаком. =)
Автор: wolf0425
Дата сообщения: 26.10.2009 21:15
mouser

Цитата:
у меня не выходит .... впихнуть в цикл который был предложен ранее

выноси все переименование в подпрограмму и правь имена в ней.
как-то так:

do call :_REN "%%k"

goto :eof

:_REN
set "%oldname%=%~n1"
set "%newname%=! %oldname:~2,-2%%~x1"
ren "%oldname%%~x1" "%newname%" && echo %1 переименован в %newname% >> 1.txt || echo %1 найден но не переименован >> 1.txt
goto :eof

Добавлено:
king_stiven, с твоим вариантом будут проблемы при лишних "=" в середине имени.
Автор: king_stiven
Дата сообщения: 26.10.2009 22:12
wolf0425

Цитата:
king_stiven, с твоим вариантом будут проблемы при лишних "=" в середине имени.

В приведённых челом примерах нет лишних "=", впрочем ему дали много инфы, пусть поработает и сам немножко
Автор: Ortios
Дата сообщения: 26.10.2009 22:35
llanowar

Цитата:
Подскажите, как узнать имя текущего залогиненного пользователя на компе по сети?
пробовал через psexec.exe <комп> -с 1.cmd , где 1.cmd одержит echo %username%, но все время получаю свое имя пользователя. Какие есть варианты?

Задавал в предыдущей части вопрос на эту тему, предложив:

Цитата:
Может быть можно как-нибудь просканировать папки в профилях \\comp01\c$\Documents and Settings\*.*, определить самый свежий ntuser.dat и потом вырезать из пути имя пользователя?

но никто не откликнулся, а сам я не осилил эту задачу.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778

Предыдущая тема: во вкладке автозагрузка


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