Get-ChildItem -Path D:\test -Recurse -File |
Where-Object { $_.BaseName -match '^[0-9]+$' } |
ForEach-Object { ($_.FullName -split '\\')[-2,-1] -join '\' } | #'
Out-File D:\wim.txt
($_.FullName -Split '\\')[-2,-1]
извлекает последние 2 компонента из пути к файлу - и
-join '\'
объединяет их вместе.
Обратите внимание, чтокроме проблемы форматирования строки, ваша исходная команда не работает должным образом, поскольку | select -last 2
применяется к общему выходу , а не за соответствующий файл ;таким образом, даже если имеется несколько совпадающих файлов, вы всегда получите только родительский каталог и имя файла last соответствующего файла.
Поэтому указанная выше команда извлекаетпоследние 2 \
компоненты пути, разделенные внутри блока ForEach-Object
, непосредственно в результате операции -split
, так что 2 (соединенных) компонента возвращаются на файл .
Кроме того, -3
в $_.FullName -split '\', -3, 'SimpleMatch'
не извлекает последние 3 токена;в настоящее время он фактически обрабатывается так же, как 0
, что означает, что все результирующие токены возвращаются;учитывая, что -split
по умолчанию использует регулярные выражения , а представление литерала \
требует экранирования, поскольку \\
, $_.FullName -split '\', -3, 'SimpleMatch'
совпадает с $_.FullName -split '\\'
, что и используется в приведенном выше решении.
Обратите внимание, что есть зеленое освещение -split
улучшение , которое даст отрицательные <Max-substrings>
значения новое значение в будущем, применяя текущую логику положительных чиселаналогично end входной строки;например, -3
будет означать: вернуть последние 2 компонента плюс все, что осталось от входной строки перед ними (с полученными токенами, все еще сообщаемыми слева направо).