Показать полную графическую версию : Поженить cmd/bat и powershell
Оказалос, что моему 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 не кусается.
Ну и я свои 5 копеек заброшу... :)
Можно ли как- то именно в CMD/BAT скрипте пройти по каждой строке SCV файлика и Прочитать значения в переменные, чтобы дальше с ними пошуршать? »
Легко.
Вопрос только в целесообразности, которая определяется самой задачей в целом. Возможно и cmd (статичный, малофункциональный и умирающий инструмент) не понадобится вовсе...
Со всемми согласен, поясню дополнительно.
Есть уже готовый скрипт на 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.
Может у вас есть? :)
В общем-то у меня сейчас не самое элегантное, но решение есть.
Просто через for /f "usebackq tokens=1-8 delims=^:"
Потом собираю нужный из четырёх токенов. Работает, но если чего в структуре csv поменяетя (например не будет логин:пароль) — всё сломается :(
главная проблема в том, что разделитель «:» встречается не только в виде разделителя »
Это не проблема, если, конечно, все "ненужные" разделители находятся внутри кавычек, как указано в Вашем примере.
Записи в этом 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
Остальные хотелки требуют конкретных образцов файлов.
Не надо навязывать свой способ решения. Лучше подробно формулируйте задачу: что имеем (примеры файлов) что хотим получить (пример файла). Очень желательно файлы приложить.
но если чего в структуре 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
Подскажите, как запустить файл 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).
выскакивает ошибка. »
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"
DJ Mogarych, спасибо, всё получилось!
Какими командами дополнить файл 1.ps1, чтобы он выполнялся в системе, в которой по умолчанию отключено выполнение сценариев powershell или у пользователя нет прав администратора? Нужно временное повышенные прав на выполнение команды powershell.
DJ Mogarych
03-04-2023, 16:37
Если у пользователя нет прав администратора, то повышать права он не может.
DJ Mogarych
03-04-2023, 17:28
В самом простом случае запустить PS он сможет и сделать копию своих личных сертификатов. Сертификаты системы - вряд ли.
Что там в каждом конкретном случае - зависит от настроек, надо проверять.
При установке сертификатов, когда выскакивает окно (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
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.