Обрезать текст в строке после/перед разделителем в powershell

Итак, вот что я пытаюсь сделать: я хочу сделать небольшой скрипт powershell, который берет каждый файл из моей музыкальной библиотеки, а затем вычисляет его хеш-сумму и записывает это в файл следующим образом:

test.txt ; 131 136 80 89 119 17 60 123 210 121 188 42 136 200 131 198

Теперь, когда я запускаю скрипт, мне нужно, чтобы он сначала сравнил мою музыкальную библиотеку с уже существующими значениями, но для этого я просто хочу отрезать все после ;, чтобы он мог сравнивать имя файла с именем файла (или путь к файлу) ... но я Я в тупике, как это сделать, попытался заменить на

$name = $name -replace ";*",""

no go...

пытался фильтровать... не знаю как D:

Я был бы очень признателен за помощь.

Также, если вы думаете, что я использую неправильный язык кодирования, скажите мне, что было бы лучше, просто я когда-либо использовал только C и powershell.


person DemonWareXT    schedule 05.03.2011    source источник


Ответы (6)


$pos = $name.IndexOf(";")
$leftPart = $name.Substring(0, $pos)
$rightPart = $name.Substring($pos+1)

Внутри PowerShell использует класс String.

person VVS    schedule 05.03.2011

Вы можете использовать Split :

$text = "test.txt ; 131 136 80 89 119 17 60 123 210 121 188 42 136 200 131 198"
$separator = ";" # you can put many separator like this "; : ,"

$parts = $text.split($separator)

echo $parts[0] # return test.txt
echo $parts[1] # return the part after the separator
person hdoghmen    schedule 25.12.2014

Это работает для определенного разделителя для определенного количества символов между разделителем. У меня было много проблем с попыткой использовать это в цикле for each, где позиция изменилась, но разделитель остался прежним. Например, я использовал обратную косую черту в качестве разделителя и хотел использовать только все, что находится справа от обратной косой черты. Проблема заключалась в том, что после того, как позиция была определена (71 символ от начала), она каждый раз использовала $pos как 71, независимо от того, где на самом деле был разделитель в сценарии. Я нашел другой метод использования разделителя и .split для разделения, а затем использовал переменную split для вызова разделов. Например, первый раздел был $variable[0], а второй раздел был $variable[1].

person David    schedule 27.03.2012

$name -replace ";*",""

Вы были близки, но использовали синтаксис выражение с подстановочными знаками вместо регулярное выражение, которое ожидает оператор -replace.

Поэтому (сокращенная хеш-последовательность):

PS> 'test.txt ; 131 136 80 89 119 17 60 123 210 121 188' -replace '\s*;.*'
test.txt

Примечание:

  • Если не указывать текстовый операнд подстановки (второй правый операнд), неявно используется "" (пустая строка), т. е. фактически удаляется то, что соответствует регулярному выражению.

  • .* представляет собой потенциально пустую серию (*) символов (.) в регулярном выражении. Это эквивалент регулярного выражения * сам по себе в выражении с подстановочными знаками.

  • Добавление \s* перед ; в регулярном выражении также удаляет завершающие пробелы (\s) после имени файла.

  • Я использовал '...', а не "...", чтобы заключить регулярное выражение, чтобы избежать путаницы между тем, что PowerShell расширяет спереди (см. расширяемые строки в PowerShell и что видит механизм регулярных выражений .NET.

person mklement0    schedule 08.06.2020

У меня был каталог, полный файлов, в том числе некоторые из них были названы номером счета-фактуры № продукта.pdf, и я хотел отсортировать их по номеру продукта, поэтому...

get-childitem *.pdf | sort-object -property @{expression={$\_.name.substring($\_.name.indexof("-")+1)}}

Обратите внимание, что при отсутствии - это сортируется по $_.name

person Clarius    schedule 04.02.2017

Используя регулярное выражение, результат находится в $matches[1]:

$str = "test.txt ; 131 136 80 89 119 17 60 123 210 121 188 42 136 200 131 198"
$str -match "^(.*?)\s\;"
$matches[1]
test.txt
person Ramiro Encinas    schedule 08.06.2020