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

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

msvrd 21-02-2023 04:00 3003764

Поженить cmd/bat и powershell
 
Оказалос, что моему cmd-скрипту надо читать csv, присваивать прочитанное переменным и работать далее с этим.
Но все поиски говорят о том, что нормально работать с CSV из батника не получится. Надо powershell +

Собствоенно вопрос:
Можно ли как- то именно в CMD/BAT скрипте пройти по каждой строке SCV файлика и Прочитать значения в переменные, чтобы дальше с ними пошуршать?

То есть вызывать powershell -command Import-Csv... И результат рсскладывать в переменные...

Serguei Kouzmine 21-02-2023 07:11 3003766

на такое рацпредложение даже мата жалко

megaloman 21-02-2023 07:41 3003769

msvrd, чтобы о чем‐ то рассуждать, надо иметь образец файла csv и понимать, почему с Вашими файлами csv не получится работать в cmd.?
Что конкретно надо присваивать переменным и что дальше с ними происходит.?
Если в полях не содержатся какие‐либо особенные для cmd символы, нет проблем, а если содержатся ‐ то каким образом Вы хотите такие строки иметь в переменных?
Приложите к сообщению файл. Как вариант, есть возможность совместить cmd и js.

DJ Mogarych 21-02-2023 08:39 3003772

msvrd, наверное, можно, но зачем? Powershell не кусается.

YuS_2 21-02-2023 09:22 3003776

Ну и я свои 5 копеек заброшу... :)
Цитата:

Цитата msvrd
Можно ли как- то именно в CMD/BAT скрипте пройти по каждой строке SCV файлика и Прочитать значения в переменные, чтобы дальше с ними пошуршать? »

Легко.
Вопрос только в целесообразности, которая определяется самой задачей в целом. Возможно и cmd (статичный, малофункциональный и умирающий инструмент) не понадобится вовсе...

msvrd 23-02-2023 00:22 3003931

Со всемми согласен, поясню дополнительно.
Есть уже готовый скрипт на cmd\bat который много разного всего делает. Переписывать это на powershel руки не поднимаются.

Одна из задач делать следущее:

Есть CSV с данными о пользователях.
Заголовками типа USER:PASSWORD:PROXY:MAIL (там больше разного записано, но не суть...)
Пример строки: user1:password1:"https://login:password@host:port":mail1@google.com
главная проблема в том, что разделитель «:» встречается не только в виде разделителя :(

Записи в этом CSV постоянно меняются записи. Одни удаляются, другие добавляются.

И вот всем этим «пользователям» надо переодически менять PROXY да так, чтобы они не повторялись.


То есть Задача 1 — раздать всем разное. Довольно простая.

Есть отдельный файлик со списком прокси типа proxy.txt, ищем какие строки из него уже содержатся в CSV. Остальные можор «раздавать» новым.

А вот «заменить» текущие не понимаю как без powershell, который умеет корректно разбирать CSV. То есть надо «вырезать» текущие значения PROXY и вставить новые. То есть перём файлик proxy.txt и построчно каждую запись от туда вставляем в каждую строку CSV, заменяя то что там сейчас в PROXY.

Идеи кроме как рзббирать CSV внешним posershell запросом, получать обратно в переменную нужное значение PROXY и потом собирать csv-строку заново и записывать у меня нет.
Ровно как и понимания как бы этот финт провернуть без переписания всего кода на ps.

Может у вас есть? :)

msvrd 23-02-2023 05:12 3003936

В общем-то у меня сейчас не самое элегантное, но решение есть.
Просто через for /f "usebackq tokens=1-8 delims=^:"
Потом собираю нужный из четырёх токенов. Работает, но если чего в структуре csv поменяетя (например не будет логин:пароль) — всё сломается :(

YuS_2 23-02-2023 08:54 3003940

Цитата:

Цитата msvrd
главная проблема в том, что разделитель «:» встречается не только в виде разделителя »

Это не проблема, если, конечно, все "ненужные" разделители находятся внутри кавычек, как указано в Вашем примере.

Цитата:

Цитата msvrd
Записи в этом CSV постоянно меняются записи. Одни удаляются, другие добавляются. »

Вопрос в том, как именно они там появляются и исчезают... :)
Если вручную редактируются, то возможны привнесенные ошибки в структуру файла, а их исправить автоматически, наверное, практически нереально...
Цитата:

Цитата msvrd
И вот всем этим «пользователям» надо переодически менять PROXY да так, чтобы они не повторялись.
То есть Задача 1 — раздать всем разное. Довольно простая.
Есть отдельный файлик со списком прокси типа proxy.txt, ищем какие строки из него уже содержатся в CSV. Остальные можор «раздавать» новым. »

Тут бы задачу поточнее сформулировать.
1. Существующие записи удалять надо все или по каким-либо критериям?
2. Раздать всем разное - в принципе, реализуемо, но тут необходимо прояснить вопрос соответствия количества записей в списке пользователей и в файле со списком прокси... хватит ли записей на всех, чтобы выполнить условие "всем разное"?
3. Какой формат записей и кодировка этого файла proxy.txt?
4. Зависит от ответа на п.3 ... Соответствует ли login:password для прокси, записи конкретного пользователя USER:PASSWORD или это разные данные?

Цитата:

Цитата msvrd
Ровно как и понимания как бы этот финт провернуть без переписания всего кода на ps. »

powershell легко вызывается из cmd для выполнения конкретного скрипта, так:
Код:

powershell -ex bypass -f ".\script.ps1"
т.е. запускается сеанс powershell, выполняется скрипт powershell, а далее продолжится выполнение сценария cmd

megaloman 23-02-2023 10:23 3003945

msvrd, Если смысл камлания - вытащить то, что в кавычках
Код:

@Echo Off
cls
        Set "FileCSV=Z:\Box_In\file.csv"
        FOR /F "usebackq delims=" %%i In (`2^>nul More +1 "%FileCSV%"`) DO (
                Set "Str=%%i"
                Call :Parse "Proxy" "%%Str:"=" "%%"
                Echo. &Echo %%i &Call Echo %%Proxy%%
        )
pause
Exit /B

:Parse
        Set "%~1=%3"
Exit /B

Файл csv для отладки
Код:

USER:PASSWORD:PROXY:MAIL
user1:password1:"https://login:password@host:port1":mail1@google.com
user2:password1:"https://login:password@host:port2":mail1@google.com
user3:password1:"https://login:password@host:port3":mail1@google.com


Остальные хотелки требуют конкретных образцов файлов.
Не надо навязывать свой способ решения. Лучше подробно формулируйте задачу: что имеем (примеры файлов) что хотим получить (пример файла). Очень желательно файлы приложить.

YuS_2 23-02-2023 12:59 3003956

Цитата:

Цитата msvrd
но если чего в структуре csv поменяетя (например не будет логин:пароль) — всё сломается »

Изучайте powershell, он ничего не сломает...

Вот, примерное решение (если уточните задачу, ответив на поставленные выше вопросы, то код, возможно, придется изменить):
script.ps1
Код:

$fincsv = '.\in.csv'
$foutcsv = '.\out.csv'
$fproxy = '.\proxy.txt'

$csv = import-csv $fincsv -d ':'
$prx = gc $fproxy -enc utf8
$param = @{
        Path = $foutcsv
        Delimiter = ':'
        Encoding = 'utf8'
        NoTypeInformation = $true
}
if ($host.version.major -ge 7){$param += @{UseQuotes='AsNeeded'}}
if($prx.count -lt $csv.count){
        write-host Количество новых PROXY меньше количества пользователей -for red
        sleep 5
        break
}
$csv|%{$i,$arr=0,@()}{
        $tmp = $_.proxy
        if ($tmp -notin $prx -or $tmp -in $arr.proxy){
                        $_.proxy = $prx[$i]
                        $i++
        } else {
                $prx = $prx|?{$_ -ne $tmp}
        }
        $arr += $_
}{$arr} |export-csv @param



in.csv
Код:

USER:PASSWORD:PROXY:MAIL
user1:password1:"https://login8:password8@newhost8:newport8":mail1@google.com
user2:password2:"https://login2:password2@newhost2:newport2":mail2@google.com
user3:password3:"https://login3:password3@host:port":mail3@google.com
user4:password4:"https://login1:password1@newhost1:newport1":mail4@google.com
user5:password5:"https://login5:password5@host:port":mail5@google.com
user6:password6:"https://login6:password6@host:port":mail6@google.com
user7:password7:"https://login7:password7@host:port":mail7@google.com
user8:password8:"https://login8:password8@host:port":mail8@google.com



proxy.txt
Код:

https://login1:password1@newhost1:newport1
https://login2:password2@newhost2:newport2
https://login3:password3@newhost3:newport3
https://login4:password4@newhost4:newport4
https://login5:password5@newhost5:newport5
https://login6:password6@newhost6:newport6
https://login7:password7@newhost7:newport7
https://login8:password8@newhost8:newport8


sov44 03-04-2023 13:45 3006636

Подскажите, как запустить файл 1.ps1 powershell, передав в в него параметр "c:\test".

1.ps1
Код:

Get-ChildItem -Path cert:\LocalMachine\Root |select -unique |Export-Certificate -FilePath $args[0]\RootCertBackup.sst -Type SST
Get-ChildItem -Path cert:\LocalMachine\CA |select -unique |Export-Certificate -FilePath $args[0]\CACertBackup.sst -Type SST

При запуске батника
Код:

powershell -ex bypass -f "c:\22\1.ps1" "c:\test"
выскакивает ошибка.

NickM 03-04-2023 14:51 3006645

Цитата:

Цитата sov44
выскакивает ошибка. »

C помощью, например:
Код:

Write-Output
можно попробовать посмотреть, а что у Вас формируется в, например, этой строке:
Код:

$args[0]\RootCertBackup.sst
, где наверняка Вы обнаружите перенос строки.

Поэтому, либо следует подумать, что делать (вырезать) со спец.символами в:
Код:

$args[0]
например таким образом:
Код:

$path_to_dir=$args[0] -replace '\n'
, либо передавать полные пути к файлам в качестве параметров.

DJ Mogarych 03-04-2023 15:09 3006646

Код:

"$($args[0])\RootCertBackup.sst"

sov44 03-04-2023 15:33 3006648

DJ Mogarych, спасибо, всё получилось!

sov44 03-04-2023 16:24 3006652

Какими командами дополнить файл 1.ps1, чтобы он выполнялся в системе, в которой по умолчанию отключено выполнение сценариев powershell или у пользователя нет прав администратора? Нужно временное повышенные прав на выполнение команды powershell.

DJ Mogarych 03-04-2023 16:37 3006653

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

DJ Mogarych 03-04-2023 17:28 3006655

В самом простом случае запустить PS он сможет и сделать копию своих личных сертификатов. Сертификаты системы - вряд ли.
Что там в каждом конкретном случае - зависит от настроек, надо проверять.

sov44 04-04-2023 21:29 3006720

При установке сертификатов, когда выскакивает окно, нужно нажимать на "да". Как автоматизировать этот нюанс?
Код:

Import-Certificate -FilePath c:\cert\CU_RootCertBackup.sst -CertStoreLocation cert:\CurrentUser\Root

DJ Mogarych 04-04-2023 21:35 3006721

Код:

-Confirm:$false

sov44 04-04-2023 21:53 3006722

DJ Mogarych, добавил в конец, не сработало. https://imgsh.net/a/G3fYzax.png
Код:

Import-Certificate -FilePath c:\cert\CU_RootCertBackup.sst -CertStoreLocation cert:\CurrentUser\Root -Confirm:$false

DJ Mogarych 04-04-2023 22:14 3006723

Код:

$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2("C:\folder\mycertificate.cer")
$rootStore = Get-Item cert:\LocalMachine\Root
$rootStore.Open("ReadWrite")
$rootStore.Add($cert)
$rootStore.Close()

https://www.appveyor.com/docs/deploy...e-to-a-website
https://social.technet.microsoft.com...rverpowershell

sov44 05-04-2023 08:30 3006734

К сожалению и этот сценарий не сработал https://imgsh.net/a/VEYM8xe.png. Возможно причина проблемы в контейнере sst?
4.ps1
Код:

$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2("c:\cert\CU_RootCertBackup.sst")
$rootStore = Get-Item cert:\CurrentUser\Root
$rootStore.Open("ReadWrite")
$rootStore.Add($cert)
$rootStore.Close()

Прикрепил для тестов файл CU_RootCertBackup.sst

DJ Mogarych 05-04-2023 10:02 3006737

Код:

Get-ChildItem -Path C:\temp\CU_RootCertBackup.sst |Import-Certificate -CertStoreLocation cert:\LocalMachine\Root
https://social.technet.microsoft.com...serversecurity


Время: 23:54.

Время: 23:54.
© OSzone.net 2001-