С Новым годом! Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
2291 / 426 / 113
Регистрация: 26.09.2020
Сообщений: 788
1

Окавычить и разбить нельзя Разбить и окавычить

10.08.2023, 11:25. Показов 1108. Ответов 35

Author24 — интернет-сервис помощи студентам
Как разбить стоку, типа (командная строка Windows):
PowerShell
1
'C:\Program Files\Realtek\Audio\HDA\RtlUpd64.exe -r -m -nrg2709'
в массив:
PowerShell
1
2
3
4
5
6
@(
    '"C:\Program Files\Realtek\Audio\HDA\RtlUpd64.exe"'
    '-r'
    '-m'
    '-nrg2709'
)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.08.2023, 11:25
Ответы с готовыми решениями:

Thread разбить программу в несколько потоков mutex, разбить класс на несколько потоков
Всем привет! Помогите пожалуйста разделить мою программу на несколько потоков, вроде используют...

Разбить строку на предложения, а предложения разбить на слова
Разбить строку на предложения с помощью функции strtok, эти предложения разбить на слова с помощью...

Разбить строку
Доброго времени суток. Есть некая переменная, уже с присвоенным значением, например 25433. Как эту...

Разбить на страницы
Есть index.php, выводятся изображения из базы, только 12 штук, сортируются по дате и самые поздние...

Разбить текст
Здравствуйте, подскажите пожалуйста есть ли возможность разбить текст(поставить пробел), если...

35
Любознательный
6695 / 1950 / 335
Регистрация: 10.03.2016
Сообщений: 4,504
10.08.2023, 12:21 2
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
разбить стоку, типа
разбить-то проблем нет... вопрос только куда и чего окавычивать, а главное - зачем? Это же и так строки... но ежели очень хочется:

PowerShell
1
2
'C:\Program Files\Realtek\Audio\HDA\RtlUpd64.exe -r -m -nrg2709' -split ' (?=-)'|%{$a=@()}{$a += "`'$_`'"}
$a
1
2291 / 426 / 113
Регистрация: 26.09.2020
Сообщений: 788
10.08.2023, 13:23  [ТС] 3
Цитата Сообщение от YuS_2 Посмотреть сообщение
вопрос только куда и чего окавычивать
путь с исполняемым файлом вестимо, первая строка в массиве, в примере окавычена.

чего, нет в примере, но может быть в строке, типа (командная строка Windows), так это окавыченный путь к исполняемому файлу:
PowerShell
1
'"C:\Program Files\Realtek\Audio\HDA\RtlUpd64.exe" open /r /m /nrg2709' -split ' (?=-)'|%{$a=@()}{$a += "`'$_`'"}
0
1563 / 256 / 65
Регистрация: 03.06.2020
Сообщений: 649
10.08.2023, 13:51 4
Если в пути нет тире:

PowerShell
1
2
3
4
'C:\Program Files\Realtek\Audio\HDA\RtlUpd64.exe -r -m -nrg2709' -split '\s+(?=-)' `
                                                                 -replace '^|$','"' `
                                                                 -replace '^|$',"'" `
                                                                 -replace '(?<=-.+)"|"(?=-.+)'
Код
'"C:\Program Files\Realtek\Audio\HDA\RtlUpd64.exe"'
'-r'
'-m'
'-nrg2709'
0
2291 / 426 / 113
Регистрация: 26.09.2020
Сообщений: 788
10.08.2023, 14:00  [ТС] 5
Накидал варианты строк, что в голову пришли, вроде валидные, с точки зрения (командная строка Windows)
PowerShell
1
2
3
4
5
6
@(
    'C:\Program Files\Realtek\Audio\HDA\RtlUpd64.exe -r -m -nrg2709'
    '"C:\Program Files\Realtek\Audio\HDA\RtlUpd64.exe" open /r /m /nrg2709'
    '"C:\Program Files\Realtek\Audio\HDA\RtlUpd64.exe" open -r --m /nrg2709'
    'C:\Program Files\Realtek\Audio\HDA\Rtl-Upd-64.exe open -r --m /nrg2709'
)
https://intellitect.com/blog/c... argvw-api/
…не понимает путь с пробелами
0
Любознательный
6695 / 1950 / 335
Регистрация: 10.03.2016
Сообщений: 4,504
10.08.2023, 15:02 6
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
Накидал варианты строк, что в голову пришли, вроде валидные, с точки зрения (командная строка Windows)
Тогда лучше таки описать смысл сего действия (чего и откуда поступает и куда подается всё хозяйство), возможно есть другие пути решения...

Добавлено через 2 минуты
нет, можно, конечно, составить регулярку и на такие извращения... но лучше таки иметь представление о задаче в целом...
0
2291 / 426 / 113
Регистрация: 26.09.2020
Сообщений: 788
10.08.2023, 15:27  [ТС] 7
Цитата Сообщение от YuS_2 Посмотреть сообщение
смысл сего действия
Задача разбить командную строку на исполняемый файл и аргументы.
Функция CommandLineToArgvW из shell32.dll её решает, только не справляется, если путь с пробелами и без кавычек.
0
6297 / 2138 / 337
Регистрация: 10.12.2013
Сообщений: 7,370
10.08.2023, 15:35 8
Beginning in PowerShell 3, the Abstract Syntax Tree is exposed to you,
so you, too, can now analyze PowerShell code and learn about its internal structure.

https://powershell.one/powersh... yntax-tree
1
Любознательный
6695 / 1950 / 335
Регистрация: 10.03.2016
Сообщений: 4,504
10.08.2023, 18:08 9
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
Задача разбить командную строку на исполняемый файл и аргументы.
да то, что разбить - понятно... чего дальше со всем этим делать предполагаешь?
ок, если не хочешь рассказывать, тогда так:
PowerShell
1
2
3
4
5
6
7
8
$arr = @(
    'C:\Program Files\Realtek\Audio\HDA\RtlUpd64.exe -r -m -nrg2709'
    '"C:\Program Files\Realtek\Audio\HDA\RtlUpd64.exe" open /r /m /nrg2709'
    '"C:\Program Files\Realtek\Audio\HDA\RtlUpd64.exe" open -r --m /nrg2709'
    'C:\Program Files\Realtek\Audio\HDA\Rtl-Upd-64.exe open -r --m /nrg2709'
)
$arr|%{$a=@()}{"$_" -split '(?<=exe\"?) | (?=-|/)'|%{$a+=$_}}
$a
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
Задача разбить командную строку на исполняемый файл и аргументы.
ну и старый древний способ:
Windows Batch file
1
&"powershell.exe" --% -vers 2.0
0
2291 / 426 / 113
Регистрация: 26.09.2020
Сообщений: 788
10.08.2023, 19:14  [ТС] 10
Цитата Сообщение от volodin661 Посмотреть сообщение
Abstract Syntax Tree
не понял к чему это.

Цитата Сообщение от YuS_2 Посмотреть сообщение
старый древний способ
о5 таки не понял. не работает 2 пошик у меня.

Цитата Сообщение от YuS_2 Посмотреть сообщение
тогда так
а если такие строки…
Код
'C:\Program Files\Realtek\Audio\EXE and Com\Rtl-Upd-64.exe open -r --m /nrg2709'
'C:\Program Files\Realtek\Audio\HDA\Rtl-Upd-64.com open -r --m /nrg2709'
то же по расширению
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@(
    'C:\Program Files\Realtek\Audio\HDA\RtlUpd64.exe -r -m -nrg2709'
    '"C:\Program Files\Realtek\Audio\HDA\RtlUpd64.exe" open /r /m /nrg2709'
    '"C:\Program Files\Realtek\Audio\HDA\RtlUpd64.exe" open -r --m /nrg2709'
    'C:\Program Files\Realtek\Audio\HDA\Rtl-Upd-64.exe open -r --m /nrg2709'
    'C:\Program Files\Realtek\Audio\EXE and Com\Rtl-Upd-64.exe open -r --m /nrg2709'
    'C:\Program Files\Realtek\Audio\HDA\Rtl-Upd-64.com open -r --m /nrg2709'
    'C:\Program Files\Realtek\Audio\.exe and .com\Rtl-Upd-64.exe open -r --m /nrg2709'
)|%{if (-not $_.StartsWith("`"")) {
    foreach ($item in $env:PATHEXT.Split(';').ToLower()) {
        if ($_.ToLower().IndexOf($item) -gt 0) {
            "`"" + $_.Replace("$item ", "$item`" " )
            break
        }
    }
} else {
        $_
    }
}
нерешаемо
0
Любознательный
6695 / 1950 / 335
Регистрация: 10.03.2016
Сообщений: 4,504
10.08.2023, 20:01 11
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
о5 таки не понял. не работает 2 пошик у меня.
эхм... там неважен второй пошик, он всего лишь для примера, там важен оператор --%

Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
нерешаемо
конечно, нерешаемо! Чтобы получить вменяемое решение, необходимо использовать вменяемые входные данные...
Ещё разок задам вопрос:
Цитата Сообщение от YuS_2 Посмотреть сообщение
Тогда лучше таки описать смысл сего действия (чего и откуда поступает и куда подается всё хозяйство)
Может надо не костыли автоматизировать, а решить вопрос со входными данным?

Цитата Сообщение от YuS_2 Посмотреть сообщение
решить вопрос со входными данным
а именно:
1. Берем исполняемый файл
2. Составляем перечень возможных ключей
3. Впихиваем перечень ключей в регулярку:
' (?=open|close|/|-|ещёключик)'
и по этой регулярке сплитим строку...
4. Бинго!

и для верности, заставить таки подающую систему закавычивать пути с пробелами...
0
1563 / 256 / 65
Регистрация: 03.06.2020
Сообщений: 649
10.08.2023, 20:27 12
PowerShell
1
2
3
4
5
6
7
8
9
10
11
$arr = @(
    'C:\Program Files\Realtek\Audio\HDA\RtlUpd64.exe -r -m -nrg2709'
    '"C:\Program Files\Realtek\Audio\HDA\RtlUpd64.exe" open /r /m /nrg2709'
    '"C:\Program Files\Realtek\Audio\HDA\RtlUpd64.exe" open -r --m /nrg2709'
    'C:\Program Files\Realtek\Audio\HDA\Rtl-Upd-64.exe open -r --m /nrg2709'
) -replace '["'']' -replace '^(.+\.exe)','"$1"'
 
$arr.foreach{       
    $p,$a = ($_ -split '"\s?')[1,2]
    "'$p'"; $a.Split()      # '"' + $p + '"'; $a.Split()                 
}
1
2291 / 426 / 113
Регистрация: 26.09.2020
Сообщений: 788
10.08.2023, 21:20  [ТС] 13
YuS_2, входные данные такие, какие есть. не надо под ответ подбирать.
если бы знали какой файл, да параметры, нафига бы парсить тогда?

lesser, вот почти сделал, наверно приемлемый вариант, осталось совместить с перебором pathext и… найти на какой таки строке споткнётся
0
Любознательный
6695 / 1950 / 335
Регистрация: 10.03.2016
Сообщений: 4,504
10.08.2023, 21:38 14
Цитата Сообщение от YuS_2 Посмотреть сообщение
Впихиваем перечень ключей в регулярку
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$arr = @(
    'C:\Program Files\Realtek\Audio\HDA\RtlUpd64.exe -r -m -nrg2709'
    '"C:\Program Files\Realtek\Audio\HDA\RtlUpd64.exe" open /r /m /nrg2709'
    '"C:\Program Files\Realtek\Audio\HDA\RtlUpd64.exe" open -r --m /nrg2709'
    'C:\Program Files\Realtek\Audio\HDA\Rtl-Upd-64.exe open -r --m /nrg2709'
    'C:\Program Files\Realtek\Audio\EXE and Com\Rtl-Upd-64.exe open -r --m /nrg2709'
    'C:\Program Files\Realtek\Audio\HDA\Rtl-Upd-64.com open -r --m /nrg2709'
    'C:\Program Files\Realtek\Audio\.exe and .com\Rtl-Upd-64.exe open -r --m /nrg2709'
)
# Строки as is:
# $arr|%{$a=@()}{"$_" -split ' (?=open|close|-|/|итд)'|%{$a+=$_}}
# Если надо закавычить все строки:
$arr|%{$a=@()}{"$_" -split ' (?=open|close|-|/|итд)'|%{if($_ -notmatch "^[`"']"){$a+="`"$_`""}else{$a+=$_}}}
$a
Добавлено через 1 минуту
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
нафига бы парсить тогда?
хочешь придумать парсер на все случаи жизни?

Добавлено через 2 минуты
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
входные данные такие, какие есть.
пока нет четкого понимания того, что именно собираешься парсить... обязательно попадутся данные которые завалят "суперуниверсальный" парсер, такшта...
0
2291 / 426 / 113
Регистрация: 26.09.2020
Сообщений: 788
10.08.2023, 22:07  [ТС] 15
Цитата Сообщение от YuS_2 Посмотреть сообщение
хочешь придумать парсер на все случаи жизни?
зачем на все, на командную строку с аргументами, где забыли кавычки на путь с пробелами. Протоколы, shell::: не надо.
Цитата Сообщение от YuS_2 Посмотреть сообщение
пока нет четкого понимания того, что именно собираешься парсить...
да как нету, то? В первом же посте, тип (командная строка Windows).
0
Любознательный
6695 / 1950 / 335
Регистрация: 10.03.2016
Сообщений: 4,504
10.08.2023, 22:32 16
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
где забыли кавычки на путь с пробелами.
Windows Batch file
1
C:\abc def\ghi jkl vnm .bat v n j m\xy z bnh m.bat v n j m
забыли говоришь? Игра называется: попробуй спарсить...
hint:
Твоя задача, в пределах озвученных условий, выглядит так:
расширение файла, условно, может быть сопоставлено с любой программой...
примеры расширений:
1. .bat
2. .bat v
3. .bat v n
4. .bat v n j
5. .bat v n j m
... и т.д. в пределах алфавитно-цифрового массива, в любом количестве сочетаний, в том числе подкаталогов...
- возьмешься спарсить?

Добавлено через 2 минуты
add:
Цитата Сообщение от YuS_2 Посмотреть сообщение
.bat v n j m
это может быть и только расширением и расширением с ключами... в любом сочетании...
0
2291 / 426 / 113
Регистрация: 26.09.2020
Сообщений: 788
11.08.2023, 08:56  [ТС] 17
YuS_2, расширение же уже ограничили %pathext%
путь: "C:\abc def\ghi jkl vnm .bat v n j m\xy z bnh m.bat"
парметры: v n j m
после первого .bat есть еще обратный слеш — значит путь продолжается.

вот, по обратным слешам в пути, ещё поди можно и до расширения.
хотя бы, какую часть угадать более-менее уверенно.
а то сейчас, всё без кавычек == ошибка.
0
6297 / 2138 / 337
Регистрация: 10.12.2013
Сообщений: 7,370
11.08.2023, 12:10 18
а вот ещё неплохая инициатива:
- если кто-то при вводе пароля набрала только "1",
проверять ввод также и на "12", "123", "1234" и "12345".
вдруг ей было просто лень набрать полностью? или настроение было не очень ?
1
Любознательный
6695 / 1950 / 335
Регистрация: 10.03.2016
Сообщений: 4,504
11.08.2023, 13:33 19
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
расширение же уже ограничили %pathext%
где, кто?
Вот же, я уточнял:
Цитата Сообщение от YuS_2 Посмотреть сообщение
пока нет четкого понимания того, что именно собираешься парсить...
на что ты ответил:
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
В первом же посте, тип (командная строка Windows).
Поэтому:
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
путь: "C:\abc def\ghi jkl vnm .bat v n j m\xy z bnh m.bat"
парметры: v n j m
а у меня так:
Окавычить и разбить нельзя Разбить и окавычить

чего определять будем?

Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
есть еще обратный слеш
а я такой загадочный... что могу и так написать:
Windows Batch file
1
C:/abc def/ghi jkl vnm .bat v n j m/xy z bnh m.bat v n j m
и это даже будет работать...
можешь проверить:
PowerShell
1
dir d:/test -r
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
вот, по обратным слешам в пути, ещё поди можно и до расширения.
уххх... это опять предположения, а ты ведь хотел универсальности...
а расширение... ну, ты понимаешь же, что PATHEXT - не константа...

Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
а то сейчас, всё без кавычек == ошибка.
а я тебе говорил, что самый надежный способ:
Цитата Сообщение от YuS_2 Посмотреть сообщение
и для верности, заставить таки подающую систему закавычивать пути с пробелами...
есть пути с пробелами, но нет кавычек - давай до свидания. Всего делов-то!
0
2291 / 426 / 113
Регистрация: 26.09.2020
Сообщений: 788
11.08.2023, 14:50  [ТС] 20
Цитата Сообщение от YuS_2 Посмотреть сообщение
где, кто?
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
осталось совместить с перебором pathext
Цитата Сообщение от YuS_2 Посмотреть сообщение
есть пути с пробелами, но нет кавычек - давай до свидания.
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
входные данные такие, какие есть.
Цитата Сообщение от YuS_2 Посмотреть сообщение
а у меня так:
для ССЗБ, как и для остальных случаев, ничего не поменяется, не удалось распарсить — ошибка.

стёб мне не интересен.
0
11.08.2023, 14:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.08.2023, 14:50
Помогаю со студенческими работами здесь

Разбить слово
Привет господа! И так я за ответом к вам! Помогите в следующей задачи. Имеем форму, на форме...

Разбить на подпрограммы
Помогите разбить на подпрограммы, добавить файловый ввод-вывод, добавить динамическое выделение...

Разбить на подпрограммы
Помогите разбить на подпрограммы и добавить чтение из файла и запись в файл. program rekk; ...

Разбить строку
Ребят, мне нужно строку &quot;10010=P110=a10011=s101=h110=a00= 101=h1111=u11101=y0111=,00= 110=a00=...

Разбить число
Пользователь вводит строку цифр без пробелов. Необходимо написать программу, которая «разобьет» это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru