Вы можете сделать это в одной строке следующим образом:
$(select-string totaldisksize .\XML\*.xml).line -replace '.*totaldisksize="(\d+,\d+)".*','$1'
Select-String
даст вам коллекцию объектов, которая содержит информацию о матче. Свойство line
- это тот, который вас интересует, поэтому вы можете напрямую его перенести.
Использование оператора -replace
, каждый раз, когда свойство .line
соответствует совпадению totaldisksize
, вы можете запустить регулярное выражение на нем. Замена $1
будет захватывать группу в регулярном выражении, причем эта группа является частью в круглых скобках (\d+,\d+)
, которая будет соответствовать одной или нескольким цифрам, а затем запятой, а затем одной или несколькими цифрами.
Это будет печатать на экране, потому что по умолчанию powershell будет печатать объект на экране. Поскольку вы только получаете доступ к свойству .line
, это единственный бит, который был напечатан, а также только после замена была выполнена.
Если вы хотите явно использовать Write-Host
, чтобы увидеть результаты, или сделать что-нибудь еще с ними, можно хранить в переменной следующим образом:
$sizes = $(select-string totaldisksize .\XML\*.xml).line -replace '.*totaldisksize="(\d+,\d+)".*','$1'
$sizes | % { Write-Host $_ }
Вышеизложенные сохраняет результаты в массив, $sizes
, и вы перебираете его по трубопроводу до Foreach-Object
или %
. Затем вы можете получить доступ к элементам массива с помощью $_
внутри блока.
Спасибо. Оно работает. Есть ли вероятность, что я могу вам объяснить это? Я не понимаю, как это написано без записи. – user3019059
Конечно, обновил ответ. Надеюсь, что это яснее? – arco444
Amazing. Спасибо. – user3019059