Использование get-content для переименования папки? - PullRequest
1 голос
/ 18 апреля 2019

Я пытаюсь переименовать папку на основе первых 10 символов в файле с помощью команды powershell.

Я дошел до того, что извлек данные, которые мне нужно использовать для переименования, но я не знаю, как их передать.

Get-Content 'C:\DATA\Company.dat' |
    Select-Object -first 10 |
    rename 'C:\DATA\FOLDER' 'C:\DATA\FOLDER (first 10)'

часть, на которой я застрял, - (first 10), я не знаю, что перейти к этому разделу, чтобы выполнить мою задачу?

Ответы [ 2 ]

3 голосов
/ 18 апреля 2019

Select-Object -first 10 займет первые 10 объектов. В вашем случае это будут первые 10 строк файла, а не 10 символов.

Вы можете использовать что-то вроде этого

Rename-Item -Path 'C:\DATA\FOLDER' -NewName "C:\DATA\$((Get-Content 'C:\DATA\Company.dat' | Select-Object -first 1).Substring(0,10))"

Использование -first 1 для получения первой строки и .Substring(0,10) для получения первых 10 символов.

Edit: Или, как упомянуто @AdminOfThings, без Select-Object

Rename-Item -Path 'C:\DATA\FOLDER' -NewName "C:\DATA\$((Get-Content 'C:\DATA\Company.dat' -raw).Substring(0,10))"
0 голосов
/ 18 апреля 2019

В дополнение к полезный ответ Майкла Б. с третьим подходом:

Если известно, что все интересующие вас символы находятся на 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 символов, в этом случае); именно этот метод позволяет команде переименования работать с несколькими входами, где каждое новое имя получается из конкретного входного сигнала.

...