В дополнение к полезный ответ Майкла Б. с третьим подходом:
Если известно, что все интересующие вас символы находятся на 1-й строке (что является безопасным допущением в вашем случае), вы можете использовать Get-Content -First 1 ...
(также как: Get-Content -TotalCount 1 ...
) для непосредственного извлечения 1-й строки (и исключительно), который:
работает лучше, чем Get-Content ... | Select-Object -First 1
избавляет от необходимости читать весь файл в память с помощью Get-Content -Raw ...
Rename-Item 'C:\DATA\FOLDER' `
"FOLDER $((Get-Content -First 1 C:\DATA\Company.dat).Substring(0, 10))"
Примечание:
Достаточно передать только 2 * новое значение имя в Rename-Item
(параметр -NewName
); например, FOLDER 1234567890
, а не весь путь . Хотя вы можете пройти весь путь, он должен ссылаться на то же место, что и входной путь.
Команда извлечения подстроки встроена в расширяемую строку ("..."
) с помощью $(...)
оператора подвыражения .
Что касается , что вы пытались :
Select-Object -First 10
получает первые 10 входные объекты , которые являются строками файла , выводимыми Get-Content
; другими словами: через конвейер вы будете отправлять 10 строк , а не 10 символов , и даже если они были символов, они будут отправлены один за другим .
Хотя эту проблему можно решить в конвейере, она будет громоздкой и медленной:
-join ( # -join, given an array of chars., returns a string
Get-Content -First 1 C:\DATA\Company.dat | # get 1st line
ForEach-Object ToCharArray | # convert to a char. array
Select-Object -First 10 # get first 10 chars.
) |
Rename-Item 'C:\DATA\FOLDER' { 'FOLDER ' + $_ }
Тем не менее, вы могли бы превратить вышесказанное в нечто более быстрое и лаконичное:
-join (Get-Content -First 1 C:\DATA\Company.dat)[0..9] |
Rename-Item 'C:\DATA\FOLDER' { 'FOLDER ' + $_ }
Примечание:
Get-Content -First 1
возвращает (максимум) 1 строку, и в этом случае PowerShell возвращает эту строку как есть, а не заключенную в массив.
Индексирование в строку ([...]
) с помощью оператора диапазона (..'
) - например, [0..9]
- неявно извлекает символы в указанных позициях в виде массива; это как если бы вы позвонили .ToCharArray()[0..9]
Обратите внимание, как новое имя определяется с помощью аргумента блока сценария с задержкой привязки ({ ... }
), в котором $_
относится к входному объекту (строка из 10 символов, в этом случае); именно этот метод позволяет команде переименования работать с несколькими входами, где каждое новое имя получается из конкретного входного сигнала.