Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Массивы (http://forum.oszone.net/showthread.php?t=278736)

DOCznet 05-03-2014 01:34 2319240

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

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

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

Iska 05-03-2014 02:17 2319250

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

DOCznet 05-03-2014 10:01 2319313

Ок:

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

Код:

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 2319316

Цитата:

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


DOCznet 05-03-2014 10:29 2319330

Вложений: 1
Файл 110966

Вот

Iska 05-03-2014 11:49 2319378

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 2319430

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 2319465

Цитата:

Цитата 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'ом, правда, еще не особо знаком + дополнительно включать нужно на каждой машинке.

Georgio 05-03-2014 15:13 2319490

Цитата:

Цитата 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)
???

DOCznet 05-03-2014 15:58 2319522

Цитата:

Цитата 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)
??? »


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


Время: 08:43.

Время: 08:43.
© OSzone.net 2001-