New item powershell: Создание файлов и папок с Powershell New-Item с копированием и переименованием

Копирование структуры папок без содержимого с помощью PowerShell / Хабр

После приобретения нашей компанией сетевого хранилища для резервного копирования, встал вопрос о создании структуры папок, аналогично той, что уже использовались на другом хранилище. Казалось бы все просто, берем копируем и готово. Но к сожалению, вся эта структура занимает сотни гигабайт и просто копировать ее ради создания аналогичного дерева папок не совсем разумно. Кроме того, нет никакого смысла копировать туда содержимое этих папок. Создавать вручную данную структуру нереально, она достаточно витиевата и похоже уже на дерево с огромным количеством ветвей, созданную в течении длительного времени.

Постоянно работая с Powershell, я решил, что с его помощью легко смогу решить данную задачу. Первое что мне пришло в голову это вот такой код:

Copy-Item $source -Destination $destination -Recurse -Exclude *.*

но увы, как я выяснил, оказалось что при использовании параметра -Recurse, параметр -Exclude *. * не работает, он работает только без него.

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

Сначала я получал все папки, которые мне нужно было перенести на новое хранилище вот такой строкой:

$folders = Get-ChildItem $path -Recurse | ?{$_.PsIsContainer -eq $true}

переменная $folders содержит все мне необходимые папки, но она не содержит их структуры и при выполнение например такого кода:

$folders | Copy-Item $source -Destination $destination -Recurse

копируется опять же все содержимое вместе с файлами. А если делать так:

New-Item -ItemType directory $folders

то он создаст все папки в одной директории без сохранения структуры.

Я решил просмотреть свойства объектов моего массива $folders и нашел параметр FullName который содержал полный путь до папки, включая ее саму. Это не совсем то что нужно, так мне не нужно было копировать всю структуру с корня диска, а нужна была лишь ее часть. Например, FullName = ‘C:\dir1\dir2\dir3\dir4\…..\dirN’ и мне нужна структура начиная скажем с папки 4 и все что лежит далее в ней, в этом случае FullName мне не подходит. Однако ничего не мешает нам выбрать из этого пути того что нам нужно путем разбора строки.

В результате у меня получился простенький скрипт:

$path = Get-ChildItem Z:\Backup\Dir1 -Recurse | ?{$_.PsIsContainer -eq $true}

$dest = «C:\test\»

$parent = $path[0].Parent.Name

$path | foreach {

$_.FullName -match «$parent.+»

New-Item -ItemType directory ($dest + $Matches[0])

}

Сначала он забирает все папки в переменную $path.

Переменная $dest содержит путь, куда мы хотим скопировать структуры.

Затем в переменную $parent я помещаю «родителя» моей структуры, в данном случае это папка Dir1.

Далее перебирая все элементы я выполняю разбор строки параметра FullName(его результат выглядит так: Dir1\…\….\…\… а далее вся структура папок).

И затем просто создаю заново эту структуру в нужном мне месте.

Как оказалось все просто.

P.S. Есть небольшие нюансы при разборе строки параметра FullName, например если имя нашего $parent дублируется где внутри пути, а именно если наша родительская папка вложена в какую-нибудь папку с аналогичным ей именем, то результат разбора строки может быть иным нежели мы ожидаем. Впрочем там просто нужно немного поработать с регулярными выражениями и получить нужный результат.

Как создать много файлов с разным, динамическим содержанием в Powershell




программирование,



Jul 31, 2019 ·


3 мин. на прочтение



Поделиться

Потребовалось создать большое количество файлов, но с разным содержанием. К тому же содержание не однострочное, а полнотекстовое и в каждом файле разное. Я был уверен, что Powershell лучший помощник в этом деле, но как именно это сделать я не знал. Делюсь с Вами своими изысканиями.

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

Есть большой список фамилий. Под каждую фамилию нужно сгенерировать отдельный файл, содержащий несколько строк текста, но таким образом, чтобы в нужном месте подставлялась фамилия.

Задача делиться на три части.

  • Прочитать из файла фамилии
  • Создать файл
  • Поместить в файл содержимое с подстановкой фамилии в нужном месте

Прочитать из файла фамилии

Для начала нам нужно из заранее подготовленного файла построчно прочитать его содержимое и поместить его в переменную. Это делается очень просто.

$users = Get-Content users.txt

Создать файл

Создать файл тоже очень просто. Для этого используем командлет New-Item. В параметре -Path задаём путь к файлу, в параметре -Name его имя, а параметр -Value будет содержать текст, который мы хотим поместить в файл.

New-Item -Path C:\Temp -Name "file_name.txt" -Value $fileContent

Всё просто, если бы нам нужно было создать один файл с одностроковым содержимым. Чтобы создать много файлов нам понадобится цикл foreach и каким-то образом нужно поместить в файл многострочный текст, да ещё и с подстановкой динамического контента в нужном месте. Вот тут-то я и узнал о Here-Strings в powershell.

Прежде всего нам нужно поместить многострочный текст в переменную. Допустим это будет следующий текст:

Уважаемый $user,
Приветствую Вас на страницах моего нового блога. Надеюсь, что Вам здесь понравиться.
С Уважением,
danshin. ms

В Powershell мы можем использовать Here-Strings, чтобы объявить блок текста и поместить его в переменную. Вот как это делается.

$fileContent = @"
Уважаемый $user,
Приветствую Вас на страницах моего нового блога. Надеюсь, что Вам здесь понравиться.
С Уважением,
danshin.ms
"@

Переменная $fileContent будет содержать наш текст. Форматирование передаётся параметру -Value в командлете New-Item. А вместо $user будет подставляться содержимое этой переменной. Это то, что нам нужно! Осталось только поместить это всё в цикл.

Сразу приведу полный текст скрипта.

# Читаем из файла список пользователей и помещаем его в массив $users.
$users = Get-Content users.txt
# С помощью цикла foreach проходим по каждому элементу массива.
foreach ($user in $users)
{
  $fileContent = @"
Уважаемый $user,
Приветствую Вас на страницах моего нового блога. Надеюсь, что Вам здесь понравиться.
С Уважением,
danshin.ms
"@
# Создаём файл. 
  New-Item -Path C:\Temp -Name $user".txt" -Value $fileContent
}

Как видите, всё очень просто и элегантно. Думаю, что Here-Strings пригодиться ещё не раз. Напишите в комментариях, что Вы об этом думаете и какие сценарии использования Here-Strings Вы применяли.




powershell

Заходите в группу Telegram


Если есть вопросы или хотите пообщаться, то заходите в мою группу Telegram.


https://t.me/danshin_ms

Подпишитесь на новости


Чтобы не пропустить новые статьи. Я никогда не рассылаю спам!

Новый элемент — PowerShell — SS64.com

Новый элемент — PowerShell — SS64.com

  • SS64
  • PowerShell
  • Практическое руководство

Создать новый элемент в пространстве имен. Создавайте файлы и папки, символические ссылки, разделы реестра и записи реестра.

 Синтаксис
      Новый элемент [-имя]  строка  [-путь  строка  ]
         [-force] [-credential  PSCredential ] [-itemType  строка  ]
            [-значение  Объект ] [-whatIf] [-confirm]
               [-UseTransaction] [ Общие параметры ]

Ключ
   -имя  строка 
       Имя нового элемента.

   -путь  строка 
       Пути к элементам. Подстановочные знаки разрешены.
       Используйте точку (.), чтобы указать текущее местоположение.

   -значение  Объект 
       Значение нового элемента может быть передано по каналу.

   -сила
       Переопределить ограничения, препятствующие успешному выполнению команды, за исключением
       из настроек безопасности. например переименовать существующий файл.
       Создайте файл, когда каталоги в пути не
       существуют (PowerShell создаст их)

   -itemType  строка 
       Указанный провайдером тип нового элемента
       для файловой системы: файл, каталог, SymbolicLink

   -Тип  строка 
       Псевдоним для -itemType выше

   -что если
       Опишите, что произойдет, если вы выполните команду без
       фактически выполнение команды. 
        
   -подтверждать
       Запрашивать подтверждение перед выполнением команды.

   -учетные данные  PSCredential 
       Используйте учетные данные для подтверждения доступа к файлу.  Учетные данные  представляет
       имя пользователя, например «User64» или «Domain64\User64», или PSCredential
       объект, например полученный с помощью командлета Get-Credential.
       Если вы введете имя пользователя, вам будет предложено ввести пароль.
       Этот параметр не поддерживается какими-либо основными командлетами или поставщиками PowerShell.

   -Использовать транзакцию
       Включите команду в активную транзакцию. 

Стандартные псевдонимы для нового предмета: md, ni
mkdir — это функция, которая вызывает New-Item

.

New-Item создает новый элемент и устанавливает его значение. Типы элементов, которые можно создать, зависят от местоположения элемента. Например, в файловой системе New-Item используется для создания файлов и папок. В реестре New-Item создает ключи и записи реестра.

New-Item также может устанавливать стоимость создаваемых им элементов. Например, при создании нового файла командлет New-Item может добавить в файл начальное содержимое.

В Windows и в выпуске PowerShell Core команда New-Item -Type File -Value по умолчанию создает файлы UTF-8 без BOM.
Файлы в этом формате будут неправильно интерпретированы Get-Content как файлы ASCII.
Эту кодировку файла можно настроить, задав привилегированную переменную $PSDefaultParameterValues.

По умолчанию new-item отображает только что созданный элемент, на самом деле он записывает в конвейер (который по умолчанию передается хосту). Это можно подавить, назначив фиктивную переменную ($null = new-item…) или просто перенаправив конвейер на out-null.

Файлы, созданные с помощью нового элемента, будут иметь размер 0 байт, файлы большего размера, заполненные символами NUL, можно создать, вызвав .net [System.IO.File]::Create( файл ).
Это создаст файл ANSI размером 10 МБ:

.

$file = ‘C:\demo\dummy.txt’
$sizeBytes = 10 МБ
$file = [System.IO.File]::Create($file)
$file.SetLength($sizeBytes)
$файл.Закрыть()
$file.Dispose()

.Net также предоставляет способ создания временных файлов размером 0 байт: [System.IO.Path]::GetTempFileName()

Примеры

Создать текстовый файл:

PS C:\> new-item -path C:\docs -name SS64.txt -type «file» -value «some text»

Обратите внимание, что это не перезапишет существующий файл; чтобы перезаписать существующий файл, используйте set-content вместо new-item.

Создайте каталог с именем «Demo Folder» на диске C::

PS C:\> new-item -path c:\ -name «Demo Folder» -type directory

Создать новый временный файл:

PS C:\> $tmp = [System.IO.Path]::GetTempFileName()
PS C:\> get-Item -path $tmp

Создайте новую переменную с именем $myVar:

PS C:\> переменная нового элемента:\myVar -value «testing123»

Создать новую функцию:

PS C:\> $myMultiLineFunc = { #добавьте сюда определение функции }
PS C:\> New-Item -Path function:demo-func -Value $myMultiLineFunc

Если папки не существует, то создайте ее:
если (-Не (тестовый путь «F:\BACKUP»))
{
New-Item -Path «F:\BACKUP» -ItemType Directory | вне нуля
}

Создайте профиль PowerShell по пути, указанному в переменной $profile:

PS C:\> new-item -path $profile -type file -force

$profile — это автоматическая (встроенная) переменная, в которой хранятся путь и имя файла вашего профиля PowerShell

По умолчанию файл профиля не существует, хотя PowerShell имеет для него имя файла, файл можно создать с помощью New-Item или блокнота.

После использования приведенной выше команды для создания профиля вы можете ввести псевдонимы, функции и сценарии в профиль для настройки оболочки.

«Выбор — это создание» ~ Коити (японский дизайнер интерьеров)

Связанные командлеты PowerShell:

Clear-item — удалить содержимое из переменной или псевдонима.
Copy-item — Копировать элемент из расположения в пространстве имен.
Get-item — вернуть объект, представляющий элемент в пространстве имен.
Invoke-item — вызвать исполняемый файл или открыть файл (СТАРТ).
Move-item — Переместить предмет из одного места в другое.
New-Object — создать новый объект .Net.
Set-item — Установите значение пути к провайдеру.
Remove-item — удалить элемент.
Переименовать элемент — изменить имя существующего элемента.
Справка about_automatic_variables.


 

Copyright © 1999-2022 SS64.com
Некоторые права защищены

Новый элемент — команда PowerShell | PDQ

Перейти к содержимому Команды PowerShell

  New-Item  [[-Path*] ] [-Confirm] [-Credential ] [-Force] [-ItemType ] -Name* < String>[-UseTransaction] [-Value ] [-WhatIf] [] 
  New-Item  [-Path*]  [-Confirm] [-Credential ] [-Force] [-ItemType ][-UseTransaction] [-Value ] [-WhatIf] [] 

Командлет New-Item создает новый элемент и устанавливает его значение. Типы элементов, которые можно создать, зависят от местоположения элемента. Например, в файловой системе New-Item создает файлы и папки. В реестре New-Item создает ключи и записи реестра. New-Item также может устанавливать стоимость элементов, которые он создает. Например, при создании нового файла командлет New-Item может добавить в него начальное содержимое.

Параметры

-Подтвердить []

  • Значение по умолчанию: False
  • Принимает входные данные конвейера False

Запрашивает подтверждение перед запуском командлета.

-Credential

  • Значение по умолчанию: Нет
  • Принимает ввод конвейера ByPropertyName
  • 0 Указывает учетную запись пользователя, которая имеет разрешение на выполнение этого действия. По умолчанию используется текущий пользователь.

    Введите имя пользователя, например User01 или Domain01\User01, или введите объект PSCredential, например созданный командлетом Get-Credential. Если вы вводите имя пользователя, этот командлет запрашивает пароль.

    Этот параметр не поддерживается ни одним поставщиком, установленным вместе с Windows PowerShell.

    -Force []

    • Значение по умолчанию: False
    • Принимает ввод конвейера False

    Заставляет этот командлет создать элемент, который перезаписывает существующий элемент, доступный только для чтения. Реализация варьируется от поставщика к поставщику.

    -ItemType

    • Значение по умолчанию: Нет Начиная с Windows PowerShell 5.0, вы можете создавать символические ссылки, указав SymbolicLink в качестве значения этого параметра.

      -NAME

      • Это значение Требуется
      • Значение по умолчанию None
      • Принимает входной конвейер.

        Вы можете указать имя нового элемента в значении параметра Name или Path, и вы можете указать путь нового элемента в значении Name или Path.

        -Путь

        • Это значение обязательно
        • Значение по умолчанию Нет
        • Принимает входные данные конвейера ByPropertyName

        Указывает новый путь расположения. Подстановочные знаки разрешены.

        Вы можете указать имя нового элемента в Name или включить его в Path .

        -UseTransaction []

        • Значение по умолчанию: Ложь
        • Принимает ввод конвейера Ложь

        Включает команду в активную транзакцию. Этот параметр действителен только во время выполнения транзакции.

        -Value

        • Значение по умолчанию: Нет
        • Принимает ввод конвейера ByPropertyName

        Задает значение нового элемента. Вы также можете передать значение New-Item .

        -WhatIf []

        • Значение по умолчанию: Ложь
        • Принимает входные данные конвейера Ложь

        Показывает, что произойдет, если командлет запустится. Командлет не запущен.

        Этот командлет поддерживает общие параметры: Verbose, Debug,ErrorAction, ErrorVariable, WarningAction, WarningVariable,OutBuffer, PipelineVariable и OutVariable.

        Входы

        Система.Объект

        Вы можете передать значение нового элемента этому командлету.

        Выходы

        Система.Объект

        Этот командлет возвращает созданный им элемент.

        Примеры
        1. Создать файл в текущем каталоге:
           PS C:\> New-Item -Path . -Name "testfile1.txt" -ItemType "file" -Value "Это текстовая строка".
           

          Эта команда создает текстовый файл с именем testfile1.txt в текущем каталоге. Точка (.) в значении параметра Path указывает на текущий каталог. Текст в кавычках, следующий за параметром Value, добавляется в файл как содержимое.

        2. Создать каталог:
           PS C:\> New-Item -Path "c:\" -Name "logfiles" -ItemType "directory"
           

          Эта команда создает каталог с именем Logfiles на диске C:. Параметр ItemType указывает, что новый элемент является каталогом, а не файлом или другим объектом файловой системы.

        3. Создать профиль:
           PS C:\> New-Item -Path $profile -ItemType "file" -Force
           

          Эта команда создает профиль Windows PowerShell по пути, указанному в переменной $profile.

          Профили можно использовать для настройки Windows PowerShell. $Profile — это автоматическая (встроенная) переменная, в которой хранятся путь и имя файла профиля CurrentUser/CurrentHost. По умолчанию профиль не существует, хотя Windows PowerShell хранит для него путь и имя файла.

          В этой команде переменная $profile представляет путь к файлу. Параметр ItemType указывает, что команда создает файл. Параметр Force позволяет создать файл в пути к профилю, даже если каталоги в пути не существуют. Windows PowerShell создает их.

          После того, как вы используете эту команду для создания профиля, вы можете ввести псевдонимы, функции и сценарии в профиль, чтобы настроить вашу оболочку.

          Дополнительные сведения см. в разделах about_Automatic_Variables и about_Profiles.

        4. Создать каталог в другом каталоге:
           PS C:\> New-Item -ItemType "directory" -Path "c:\ps-test\scripts"
           

          Эта команда создает новый каталог Scripts в каталоге C:\PS-Test.

          Имя нового элемента каталога Scripts включено в значение параметра Path, а не указано в значении Name . Как видно из синтаксиса, допустима любая форма команды.

        5. Создать несколько файлов:
           PS C:\> New-Item -ItemType "file" -Path "c:\ps-test\test.txt", "c:\ps-test\Logs\test. журнал"
           

          Эта команда создает файлы в двух разных каталогах. Поскольку Path принимает несколько строк, вы можете использовать его для создания нескольких элементов.

        Дополнительные примечания
         New-Item * предназначен для работы с данными, предоставленными любым поставщиком. Чтобы перечислить поставщиков, доступных в вашем
        сеанса введите `Get-PsProvider`.

        Imacros | Все права защищены © 2021