PDA

Показать полную графическую версию : [решено] Массивы


DOCznet
05-03-2014, 01:34
Доброго времени суток. Как можно реализовать след. алгоритм работы скрипта:

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

Набрел на эту тему (http://forum.oszone.net/post-1886306.html), но примеров для себя я не увидел.

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

DOCznet
05-03-2014, 10:01
Ок:

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

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 мне не дотянуться.

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

DOCznet
05-03-2014, 10:29
110966

Вот

Iska
05-03-2014, 11:49
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"
}
}

Georgio
05-03-2014, 13:43
DOCznet, то или не то: @for /f "tokens=1,2" %%i in (db.txt) do @(findstr %%i in1.txt>nul&& echo explorer \\print-server.corp.ru\%%j)???

Если то, то уберите "echo".

DOCznet
05-03-2014, 14:37
Тогда правильно должно быть так:
Код:
@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= " не вышло.


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

Спасибо! С PowerShell'ом, правда, еще не особо знаком + дополнительно включать нужно на каждой машинке.

Georgio
05-03-2014, 15:13
Еще вопрос - некоторые принтеры в именах содержат пробелы (в первой колонке 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)???

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


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




© OSzone.net 2001-2012