Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Массивы

Ответить
Настройки темы
CMD/BAT - [решено] Массивы

Пользователь


Сообщения: 55
Благодарности: 2

Профиль | Отправить PM | Цитировать


Доброго времени суток. Как можно реализовать след. алгоритм работы скрипта:

Чтение строк из "in1.txt", сравнение с частью каждой строки до разделителя файла "db.txt", который представляет из себя два столбца с разделителями (наверное проще будет разделить файл db.txt на два файла и проводить ассоциацию от номеров строк); если строка из "in1.txt" совпадает с частью строки до разделителя из файла "db.txt", то часть этой строки ПОСЛЕ разделителя (или строка с тем же номером второй части файла db.txt, если его делить) записывается в переменную, после чего к ней применяется действие.

Набрел на эту тему, но примеров для себя я не увидел.

Отправлено: 01:34, 05-03-2014

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


DOCznet, для начала упакуйте файлы «in1.txt» и «db.txt» в архив, который приложите к сообщению. Затем попробуйте более внятно, возможно, с примерами, описать, что нужно получить.

Отправлено: 02:17, 05-03-2014 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 55
Благодарности: 2

Профиль | Отправить PM | Цитировать


Ок:

В одном активно использующемся батнике есть строчка:

Код: Выделить весь код
powershell "Get-WmiObject -Class Win32_Printer -ComputerName localhost | select name | out-file  -encoding default "Q:\%USERNAME%\printer$.txt""
Выходной файл "Q:\%USERNAME%\printer$.txt"" и есть in1.txt; вводные данные.
Файл db.txt - таблица соответствий принтеров - только названия: первая колонка - имена принтеров старого принт-сервера, вторая колонка - имена принтеро нового принт-сервера, именуемые иначе, но физически являющиеся теми же самыми устройствами.

Каждую строчку из вводных данных (in1.txt) мы сравниваем с каждой строкой из первой колонки файла соответствий и при совпадении мы записываем в переменную значение второй колонки из той же строки, в которой произошло совпадение со значением из первой колонки, и выполняем действие при каждом совпадении:

explorer.exe "\\print-server.corp.ru\%var%"


То что существуют политики, подключающие принтеры пользователям - знаем, просто на том уровне на котором мне приходится выполнять свою часть задач - до функционала GPO мне не дотянуться.

Отправлено: 10:01, 05-03-2014 | #3


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Iska:
упакуйте файлы «in1.txt» и «db.txt» в архив, который приложите к сообщению. »

Отправлено: 10:05, 05-03-2014 | #4


Пользователь


Сообщения: 55
Благодарности: 2

Профиль | Отправить PM | Цитировать



arch.rar

Вот

Отправлено: 10:29, 05-03-2014 | #5


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


DOCznet, почему в «db.txt» наличествуют дубликаты по первому полю, конкретно — «HP4015_OKO2»?

Пример кода на PowerShell:
читать дальше »
Код: Выделить весь код
$hNames = @{}

Get-Content -Path "C:\Песочница\041\arch\db.txt" |`
    ForEach-Object -Process {
        $aNames = $_ -split "`t"
        
        if(-not $hNames.ContainsKey($aNames[0])) {
            $hNames.Add($aNames[0], $aNames[1])
        }
    }

Get-WmiObject -Class Win32_Printer |`
    ForEach-Object -Process {
        if($hNames.Contains($_.Name)) {
            $sVar = $hNames.Item($_.Name)
            Write-Host $sVar
            
            Start-Process -FilePath "$env:systemroot\explorer.exe" -ArgumentList "\\print-server.corp.ru\$sVar"
        }
    }
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:49, 05-03-2014 | #6


Ветеран


Сообщения: 874
Благодарности: 575

Профиль | Отправить PM | Цитировать


DOCznet, то или не то:
Код: Выделить весь код
@for /f "tokens=1,2" %%i in (db.txt) do @(findstr %%i in1.txt>nul&& echo explorer \\print-server.corp.ru\%%j)
???

Если то, то уберите "echo".
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:43, 05-03-2014 | #7


Пользователь


Сообщения: 55
Благодарности: 2

Профиль | Отправить PM | Цитировать


Цитата Georgio:
Тогда правильно должно быть так:
Код:
@for /f "tokens=1,2" %%i in (db.txt) do @(findstr %%i in1.txt>nul&& echo explorer \\print-server.corp.ru\%%j)
. »

О.о Элегантно! Не ожидал, что в одну строчку уложится решение, спасибо!

Еще вопрос - некоторые принтеры в именах содержат пробелы (в первой колонке db.txt), можно как-то сделать, что бы они не считались за разделитель? Конечно не критично, т.к. таких принтеров по пальцам пересчитать.
Пробовал
Код: Выделить весь код
"tokens=1,2 delims=	"
не вышло.


Цитата Iska:
DOCznet, почему в «db.txt» наличествуют дубликаты по первому полю, конкретно — «HP4015_OKO2»?
Пример кода на PowerShell: »
Спасибо! С PowerShell'ом, правда, еще не особо знаком + дополнительно включать нужно на каждой машинке.

Отправлено: 14:37, 05-03-2014 | #8


Ветеран


Сообщения: 874
Благодарности: 575

Профиль | Отправить PM | Цитировать


Цитата DOCznet:
Еще вопрос - некоторые принтеры в именах содержат пробелы (в первой колонке db.txt), можно как-то сделать, что бы они не считались за разделитель? Конечно не критично, т.к. таких принтеров по пальцам пересчитать.
Пробовал
Код:
Код: Выделить весь код
"tokens=1,2 delims=	"
не вышло. »

А так:
Код: Выделить весь код
@for /f "tokens=1,2 delims=	" %%i in (db.txt) do @(findstr /c:"%%i" in1.txt>nul&& echo explorer \\print-server.corp.ru\%%j)
???
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:13, 05-03-2014 | #9


Пользователь


Сообщения: 55
Благодарности: 2

Профиль | Отправить PM | Цитировать


Цитата Georgio:
А так:
Код:
@for /f "tokens=1,2 delims= " %%i in (db.txt) do @(findstr /c:"%%i" in1.txt>nul&& echo explorer \\print-server.corp.ru\%%j)
??? »

То что надо. Еще раз большое спасибо!

Отправлено: 15:58, 05-03-2014 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Массивы

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Установка - raid массивы popsov Microsoft Windows 7 1 24-08-2011 19:36
C/C++ - Массивы SarGon4eg Программирование и базы данных 4 16-02-2011 18:39
C/C++ - Массивы SS3 Программирование и базы данных 3 29-04-2009 21:47
Массивы в С++ Guest Программирование и базы данных 2 27-09-2004 10:12
C++ и массивы ? IG Программирование и базы данных 9 09-06-2003 09:33




 
Переход