Войти

Показать полную графическую версию : Поженить cmd/bat и powershell


Страниц : [1] 2

msvrd
21-02-2023, 04:00
Оказалос, что моему cmd-скрипту надо читать csv, присваивать прочитанное переменным и работать далее с этим.
Но все поиски говорят о том, что нормально работать с CSV из батника не получится. Надо powershell +

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

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

Serguei Kouzmine
21-02-2023, 07:11
на такое рацпредложение даже мата жалко

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

DJ Mogarych
21-02-2023, 08:39
msvrd, наверное, можно, но зачем? Powershell не кусается.

YuS_2
21-02-2023, 09:22
Ну и я свои 5 копеек заброшу... :)
Можно ли как- то именно в CMD/BAT скрипте пройти по каждой строке SCV файлика и Прочитать значения в переменные, чтобы дальше с ними пошуршать? »
Легко.
Вопрос только в целесообразности, которая определяется самой задачей в целом. Возможно и cmd (статичный, малофункциональный и умирающий инструмент) не понадобится вовсе...

msvrd
23-02-2023, 00:22
Со всемми согласен, поясню дополнительно.
Есть уже готовый скрипт на 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
В общем-то у меня сейчас не самое элегантное, но решение есть.
Просто через for /f "usebackq tokens=1-8 delims=^:"
Потом собираю нужный из четырёх токенов. Работает, но если чего в структуре csv поменяетя (например не будет логин:пароль) — всё сломается :(

YuS_2
23-02-2023, 08:54
главная проблема в том, что разделитель «:» встречается не только в виде разделителя »
Это не проблема, если, конечно, все "ненужные" разделители находятся внутри кавычек, как указано в Вашем примере.

Записи в этом CSV постоянно меняются записи. Одни удаляются, другие добавляются. »
Вопрос в том, как именно они там появляются и исчезают... :)
Если вручную редактируются, то возможны привнесенные ошибки в структуру файла, а их исправить автоматически, наверное, практически нереально...
И вот всем этим «пользователям» надо переодически менять PROXY да так, чтобы они не повторялись.
То есть Задача 1 — раздать всем разное. Довольно простая.
Есть отдельный файлик со списком прокси типа proxy.txt, ищем какие строки из него уже содержатся в CSV. Остальные можор «раздавать» новым. »
Тут бы задачу поточнее сформулировать.
1. Существующие записи удалять надо все или по каким-либо критериям?
2. Раздать всем разное - в принципе, реализуемо, но тут необходимо прояснить вопрос соответствия количества записей в списке пользователей и в файле со списком прокси... хватит ли записей на всех, чтобы выполнить условие "всем разное"?
3. Какой формат записей и кодировка этого файла proxy.txt?
4. Зависит от ответа на п.3 ... Соответствует ли login:password для прокси, записи конкретного пользователя USER:PASSWORD или это разные данные?

Ровно как и понимания как бы этот финт провернуть без переписания всего кода на ps. »
powershell легко вызывается из cmd для выполнения конкретного скрипта, так:
powershell -ex bypass -f ".\script.ps1"
т.е. запускается сеанс powershell, выполняется скрипт powershell, а далее продолжится выполнение сценария cmd

megaloman
23-02-2023, 10:23
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
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
но если чего в структуре csv поменяетя (например не будет логин:пароль) — всё сломается »
Изучайте powershell, он ничего не сломает...

Вот, примерное решение (если уточните задачу, ответив на поставленные выше вопросы, то код, возможно, придется изменить):
$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

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

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
Подскажите, как запустить файл 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"
выскакивает ошибка (https://imgsh.net/a/c87CqKZ.png).

NickM
03-04-2023, 14:51
выскакивает ошибка. »
C помощью, например:
Write-Output
можно попробовать посмотреть, а что у Вас формируется в, например, этой строке:
$args[0]\RootCertBackup.sst
, где наверняка Вы обнаружите перенос строки.

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

DJ Mogarych
03-04-2023, 15:09
"$($args[0])\RootCertBackup.sst"

sov44
03-04-2023, 15:33
DJ Mogarych, спасибо, всё получилось!

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

DJ Mogarych
03-04-2023, 16:37
Если у пользователя нет прав администратора, то повышать права он не может.

DJ Mogarych
03-04-2023, 17:28
В самом простом случае запустить PS он сможет и сделать копию своих личных сертификатов. Сертификаты системы - вряд ли.
Что там в каждом конкретном случае - зависит от настроек, надо проверять.

sov44
04-04-2023, 21:29
При установке сертификатов, когда выскакивает окно (https://imgsh.net/a/r4lVCte.png), нужно нажимать на "да". Как автоматизировать этот нюанс?
Import-Certificate -FilePath c:\cert\CU_RootCertBackup.sst -CertStoreLocation cert:\CurrentUser\Root

DJ Mogarych
04-04-2023, 21:35
-Confirm:$false

sov44
04-04-2023, 21:53
DJ Mogarych, добавил в конец, не сработало. https://imgsh.net/a/G3fYzax.png
Import-Certificate -FilePath c:\cert\CU_RootCertBackup.sst -CertStoreLocation cert:\CurrentUser\Root -Confirm:$false




© OSzone.net 2001-2012