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

как массово добавить к имени файлов имя их родительской папки – Вадим Стеркин

Рекомендую авторский курс Павла Нагаева «Основы PowerShell«. Высокая практическая ценность, внимание к деталям, индивидуальный подход. Скидка по промокоду: outsidethebox5.

Вы тут: Главная → Windows → PowerShell: как массово добавить к имени файлов имя их родительской папки

Рубрики: Windows, Вопрос — Ответ Обновлено: 05.06.2022 комментариев 18

С этим вопросом обратился мой давний товарищ Денис. Ранее в блоге я показывал массовое переименование файлов методом поиск/замена и добавлением счетчика к файлам. Приклеивание имени родительской папки выглядит менее распространенной задачей. Тем не менее, я много раз видел в форуме скриптов вопросы про это (фильтр также выводит похожие темы). Заметьте, что там всегда хотят батники. А тут сразу PowerShell.

Когда-то я ковырялся в путях оператором -Split. Похожий метод .NET split() фигурировал в блоге с целью парсинга ссылок – для выборки уникальных ссылок на веб-странице и для загрузки с youtube-dl. Имя родительской папки можно получить так:

("C:\temp\f.txt" -Split "\\")[-2]

В кавычках указан разделитель \ (второй обратный слэш там нужен для экранирования). Получается массив из отрезков пути, где [-2] дает второй элемент с конца. Это как раз имя родительской папки.

Однако Василий Гусев давно повелел освоить командлет Split-Path. Он функциональный, конечно, но в рамках данной задачи интуитивностью не блещет. Судите сами:

Split-Path (Split-Path -Path "C:\temp\f.txt" -Parent) -Leaf

Второй командлет (в скобках) выдает путь к родительской папке с помощью параметра -Parent. А первый Split-Path с параметром -Leaf извлекает из пути последний отрезок, т.е. искомое имя папки.

Дальше все сводится к ванлайнеру, но так его будет чуть легче воспринимать:

Get-ChildItem -File | ForEach-Object {
    Rename-Item $_. FullName -NewName ("$(Split-Path (Split-Path $_.FullName -Parent) -Leaf)_$($_.Basename)$($_.Extension)") -WhatIf
    }

Новое имя собирается из кирпичиков:

  • $(Split-Path (Split-Path $_.FullName -Parent) -Leaf) — имя родительской папки
  • _ — просто разделитель между именем родительской папки и текущим именем файла
  • $($_.Basename) — текущее имя файла без расширения
  • $($_.Extension) — расширение

Заметьте, что обрабатываются файлы только в текущей папке. Добавьте к Get-ChildItem параметр -Recurse, если для вложенных папок необходимо добавлять их имена к файлам. Если же для файлов из вложенных папок нужно добавлять имя «главной» родительской, проще поместить его в переменную. И дальше подставлять ее вместо двойного Split-Path для каждого файла.

А о чем был ваш последний скрипт или хотя бы ванлайнер?

Метки: PowerShell Информация в статье применима к Windows 7 и новее

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

← Как создать ярлык для отправки Windows в сон, когда получается только в гибернацию

Нюансы VHDX: как увеличить раздел с Windows, когда мешает раздел восстановления →

Подпишитесь на канал и читайте интересные записи чаще! Есть вопросы? Задайте их в чате.

Скрипт Windows PowerShell архивации RedMine Turnkey Hyper-V по ssh / Хабр

Исходные данные

  • Windows Server Standart 2019.

  • Hyper-V.

  • RedMine установлен из образа Turnkey (https://www.turnkeylinux.org/redmine).

  • PowerShell-7.1.5-win-x64.msi

Задача

Получить бакап БД и файлов RedMine размером поменьше чем целый образ Hyper-V.

Надо немного уметь в PowerShell и PuTTY (хотя рекомендую WinSCP — визуально править файлы и по каталога ходить).

После отладки и корректировки под свои дополнительные нужды (например исключить большие Git каталоги) засунуть в стандартный планировщик Windows (не забыть про указание рабочего каталога).

Реализация

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

1. Windows. Установить OpenSSH.Client, выполнить PowerShell

Add-WindowsCapability -Online -Name OpenSSH.Client*

2. Windows. Сгенерировать shh ключ, выполнить PowerShell

cd c:\Users\[UserName]\.ssh
ssh-keygen -t rsa -b 4096 -C "[email protected]"

[UserName] — имя текущего пользователя.

Каталог c:\Users\[UserName]\.ssh обычно скрытый и\или системный. При отсутствии каталога предварительно его создать.

[email protected] — e-mail текущего пользователя.

3. Redmine. Содержимым из c:\Users\[UserName]\.ssh\id_rsa.pub дополнить файл(добавить новую строку) root/.ssh/authorized_keys

Каталог root/.ssh/authorized_keys обычно скрытый и\или системный.

4. Windows. Установка первого соединения, выполнить PowerShell

ssh [email protected]

root — пользователь RedMine

192.168.1.155 — IP Hyper-V, где развернут RedMine

PowerShell попросит принять соединение, набрать yes и нажать Enter, если всё сделано верно больше вводить пароль при подключении по ssh больше не придётся.

5. Windows. Создаем файл StartBackUp.ps1 с содержимым в рабочем каталоге пользователя (в данный каталог будет производиться архивация данных RedMine)

cls
#Текущая дата
$DateStr=(Get-Date).ToString("yyyy_MM_dd_hh_mm_ss")
#Создаем (удаляя предыдущий) скрипт арихивации
Write-Host "=====================$DateStr======================"
$FileName = "BackUpScript.ps1"
if (Test-Path $FileName) 
{
  Remove-Item $FileName
}
#Формируем имя временного каталога RedMine
$BackUpPath="/var//www//"+$DateStr
Write-Host "Create: $FileName"
#Создать временный каталог для архива
"ssh root@192. 168.1.155 'mkdir "+$BackUpPath+"'">>$FileName
#Архив файлов
"ssh [email protected] 'tar -cvf "+$BackUpPath+"/files.tar.gz /var/www/redmine/files'">>$FileName
#Архив Git
"ssh [email protected] 'tar -cvf "+$BackUpPath+"/git.tar.gz /srv/repos/git'">>$FileName
#Архив базы RedMine
"ssh [email protected] '/usr/bin/mysqldump -u redmine -p9323XXXXXXX13ad redmine_production | gzip > "+$BackUpPath+"/redmineDB.gz'">>$FileName
#Запуск скрипта архивации
Write-Host "Run: $FileName"
.\BackUpScript.ps1
#Копировние временного каталога RedMine в текущий рабочий каталог Windows
Write-Host "Copy dir from $BackUpPath to "(Get-Location)
scp -r [email protected]:$BackUpPath (Get-Location)
#Создаем (удаляя предыдущий) скрипт удаления временного каталога RedMine
$FileName = "DelBackUpScript.ps1"
if (Test-Path $FileName) 
{
  Remove-Item $FileName
}
#Запуск скрипта удаления
"ssh [email protected] 'rm -r "+ $BackUpPath+"'">>$FileName
Write-Host "Run: $FileName"
.\DelBackUpScript. ps1

Данные для строки архива базы RedMine брать из /var/www/redmine/config/database.yml

6. Windows. Запускаем PowerShell, переходим в каталог с StartBackUp.ps1 и запускаем его на исполнение.

PowerShell Создать каталог | Как создать каталог в PowerShell?

Встроенный каталог команд предлагает множество команд для создания папки или каталога в PowerShell. Для создания каталога используется популярная команда New-item. Он также может быть создан с различными атрибутами. Хотя они не являются встроенными командами PowerShell, команды mkdir и md используются для создания каталогов. С помощью команды New-item в командлете также создается папка. Параметр itemtype используется для указания имени и расположения папки, в которой он должен быть создан.

Ключевые выводы

  • Каталог по умолчанию в PowerShell — C:\user\имя пользователя.
  • Новый элемент используется для создания файлов, папок, каталогов, реестров и т. д.
  • Каталог можно создать с помощью команды mkdir, md.
  • Каталоги работают с объектами файловой системы.
  • класс .net framework и System.io. объект каталога используется для создания каталогов.
  • Путь и соответствующие ссылки создаются вместе с каталогом.

Обзор PowerShell Create Directory

Управление файлами является важной частью; необходимо управлять и разделять все папки и предоставлять соответствующий доступ к соответствующему ресурсу. Он также должен выполнять другие стандартные операции с папками и файлами резервного копирования в системе Windows. Хотя это может показаться сложным, с помощью PowerShell можно легко управлять файлами и работать с ними. Это уменьшает количество ручной работы, связанной с управлением файлами.

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

Как создать каталог в PowerShell?

Новый каталог можно создать несколькими способами, некоторые из них приведены ниже; новый элемент используется для создания новых ссылок, новых папок, файлов или каталогов. –itemtype следует указать вместе с новой командой для создания каталога и имени пути.

Код:

 New-item – каталог itemtype новая папка 

Вывод:

Абсолютный путь используется в команде new-item, где новый каталог будет создан по новому пути. Использование двойных кавычек более важно для указания папок и пути. Новый элемент –item также используется для указания атрибута –path, где имя папки и путь должны быть указаны в структурированном формате.

Код:

 Новый элемент — тип элемента — каталог — путь ‘C: \data \folder1 

Новый элемент используется для создания ассоциативного пути и папок. В приведенной выше команде папка1 создается в родительском каталоге. В качестве альтернативы путь к каталогу и имя могут быть разделены значениями –name и –path.

Создание каталога с помощью команд md и mkdir

Команда md используется с командой new-item и работает со всеми атрибутами и синтаксисом. Команда md используется для создания каталога путем указания имени папки. Md и mkdir представляют каталог make.

Как создать Windows с помощью PowerShell?

Службы Windows обычно работают в фоновом режиме без вмешательства пользователя. Например, здесь веб-сервер отвечает на HTTP-запрос веб-страниц в сети и работает как служба и приложение для мониторинга, которое измеряет производительность журнала и данные об аппаратных событиях. Эти службы могут автоматически запускаться при загрузке системы. Если они запускаются по запросу, они запрашиваются приложением, которое от них зависит. Служба, выполняемая в сеансе Windows, отличается от сеанса пользовательского интерфейса. Они могут выполняться в нескольких системных процессах с особыми правами для ограничения угроз безопасности.

Windows PowerShell можно создать в PSSservice. Скрипт Ps1, выполнив следующие шаги.

В Windows функции службы управления PowerShell устанавливаются и удаляются самостоятельно. Затем он останавливается и запускается с помощью функций службы управления в PowerShell.

Содержит простой фрагмент C#, который создает файл PSService.exec в том месте, которое SCM ожидает с помощью команды Add-type. Снова отправьте файл pssservice.exe в сценарий psservice.ps1, используя операцию службы. Функции работы службы включают в себя onstop, onstart, response и другие события.

С помощью заглушки psservice.exe пользователь может управлять панелью управления SCM и доступными интерактивными инструментами. Будьте надежными и нажимайте команду в любом состоянии. Например, он может быть остановлен автоматически перед удалением или оставаться бездействующим при запуске для запуска уже запущенной службы. Функции Windows PowerShell версии 2 поддерживают Windows 7 и все последние версии Windows.

Новая команда создает каталог

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

Итак, чтобы создать папку или файл в PowerShell. Дайте команду нового элемента. Приведенная ниже команда создаст файл file1.txt. Тип элемента обозначает файл, создающий новый файл с пустым содержимым. Следовательно, он создает новый пустой текстовый файл для пользователя.

Код:

 Новое — Элемент — путь ‘ \\ shared \testfolder \file1.txt’ - файл типа элемента. 

Часто задаваемые вопросы

Ниже приведены часто задаваемые вопросы:

Q1. В Windows 11, как открыть новую папку в PowerShell?

Ответ:

Укажите PowerShell в меню запуска и выберите приложение Windows PowerShell в строке поиска. Перейдите в C, затем в Windows, затем в систему 32, затем в Windows PowerShell, выберите папку v1. 0 и щелкните файл PowerShell.

Q2. Как открыть каталог в PowerShell?

Ответ:

С помощью команды new-item, mkdir или md. CD foobar используется для перехода в каталог, куда хочет перейти пользователь. CD используется для перехода к заданному местоположению. Точно так же может работать и foobar set-location.

Q3. Как исправить, если пользователь не может войти в каталог?

Ответ:

Проверить наличие разрешений и дать права rwx. Sudo setfacl –m имя пользователя –rwx имя папки.

Заключение

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

Рекомендуемые статьи

Это руководство по созданию каталога PowerShell. Здесь мы обсудим введение и то, как создать каталог в PowerShell. новая команда создает каталог и FAQ. Вы также можете ознакомиться со следующими статьями, чтобы узнать больше:

  1. PowerShell Uptime
  2. Powershell Remotesigned
  3. Служба запуска PowerShell
  4. PowerShell не имеет цифровой подписи

powershell — Создать каталог, если он не существует

спросил

Изменено
8 месяцев назад

Просмотрено
700 тысяч раз

Я пишу сценарий PowerShell для создания нескольких каталогов, если они не существуют.

Файловая система похожа на эту

 D:\
D:\TopDirec\SubDirec\Project1\Revision1\Reports\
D:\TopDirec\SubDirec\Project2\Revision1\
D:\TopDirec\SubDirec\Project3\Revision1\
 
  • Каждая папка проекта имеет несколько версий.
  • Для каждой папки ревизии требуется папка Reports.
  • Некоторые из папок «редакций» уже содержат папку «Отчеты»; однако большинство этого не делает.

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

Я могу написать скрипт для создания папки, но создать несколько папок проблематично.

  • powershell
  • powershell-ise

1

Попробуйте параметр -Force :

 New-Item -ItemType Directory -Force -Path C:\Path\That\May\Or\May\Not\Exist
 

Для первой проверки можно использовать Test-Path -PathType Container .

Дополнительные сведения см. в справочной статье MSDN New-Item.

6

 $path = "C:\temp\NewFolder"
Если(!(test-path -PathType контейнер $path))
{
      Каталог New-Item -ItemType -Path $path
}
 

Контейнер Test-Path -PathType проверяет, существует ли путь и является ли он каталогом. Если это не так, он создаст новый каталог. Если путь существует, но является файлом, New-Item вызовет ошибку (вы можете перезаписать файл, используя аргумент -force , если вы рискуете).

4

 [System.IO.Directory]::CreateDirectory('полный путь к каталогу')
 

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

4

Использование:

 $path = "C:\temp\"
    
Если (!(тест-путь $путь))
{
    md $путь
}
 
  • Первая строка создает переменную с именем $path и присваивает ей строковое значение «C:\temp»

    .

  • Вторая строка представляет собой оператор If , который использует командлет Test-Path для проверки существования переменной $path , а не . Не существует определяется с помощью ! символ.

  • Третья строка: если путь, хранящийся в приведенной выше строке, равен , а не , будет запущен код, заключенный в фигурные скобки.

md — это краткая версия ввода: New-Item -ItemType Directory -Path $path

Примечание. Я не тестировал использование параметра -Force с приведенным ниже, чтобы увидеть, есть ли нежелательное поведение если путь уже существует.

 New-Item -ItemType Directory -Path $path
 

3

Следующий фрагмент кода поможет вам создать полный путь.

 Функция GenerateFolder($path) {
    $ глобальный: foldPath = $ ноль
    foreach ($ имя папки в $ path.split («\»)) {
        $global:foldPath += ($foldername+"\")
        если (!(Тестовый путь $global:foldPath)){
            New-Item -ItemType Directory -Path $global:foldPath
            # Write-Host "Папка $global:foldPath создана успешно"
        }
    }
}
 

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

Чтобы вызвать функцию, используйте следующий оператор:

 GenerateFolder "H:\Desktop\Nithesh\SrcFolder"
 

2

У меня была точно такая же проблема. Вы можете использовать что-то вроде этого:

 $local = Get-Location;
$final_local = "C:\Обработка";
если(!$local.Equals("C:\"))
{
    CDC:\";
    if((Тестовый путь $final_local) -eq 0)
    {
        мкдир $final_local;
        компакт-диск $final_local;
        лига;
    }
    ## Если путь уже существует
    ## Подключение к БД
    elseif ((Тестовый путь $final_local) -eq 1)
    {
        компакт-диск $final_local;
        эхо $final_local;
        лига; (функция, созданная вами, чтобы сделать что-то)
    }
}
 

Если вы укажете флаг -Force , PowerShell не будет жаловаться, если папка уже существует.

Однострочный:

 Get-ChildItem D:\TopDirec\SubDirec\Project* | `
  %{ Get-ChildItem $_.FullName -Редакция фильтра* } | `
  %{ New-Item -ItemType Directory -Force -Path (Join-Path $_. FullName "Отчеты") }
 

Кстати, для планирования задачи перейдите по этой ссылке: Планирование фоновых заданий.

Есть три известных мне способа создания каталога с помощью PowerShell:

 Способ 1: PS C:\> New-Item -ItemType Directory -path "C:\livingston"
 

 Метод 2: PS C:\> [system.io.directory]::CreateDirectory("C:\livingston")
 

 Метод 3: PS C:\> md "C:\livingston"
 

1

Судя по вашей ситуации, вам нужно один раз в день создавать папку «Редакция №» с папкой «Отчеты». Если это так, вам просто нужно знать номер следующей версии. Напишите функцию, которая получает номер следующей версии, Get-NextRevisionNumber. Или вы можете сделать что-то вроде этого:

 foreach($Project in (Get-ChildItem "D:\TopDirec" -Directory)){
    # Выберите все папки Revision из папки проекта.
    $Revisions = Get-ChildItem "$($Project.Fullname)\Revision*" -Directory
    # Номер следующей версии будет на единицу больше, чем самый высокий номер. 
    # Вам нужно привести строку в первом конвейере к типу int, чтобы Sort-Object работал.
    # Если вы отсортируете его по убыванию, первое число будет самым большим, поэтому вы выбираете его.
    # Если у вас есть самый высокий номер версии, вы просто добавляете к нему единицу.
    $NextRevision = ($Revisions.Name | Foreach-Object {[int]$_.Replace('Revision','')} | Sort-Object -Descending | Select-Object -First 1)+1
    # Теперь в этом мы убиваем двух зайцев одним выстрелом.
    # Он создаст папку "Отчеты", но также создаст и папку "Редакция#".
    New-Item -Path "$($Project.Fullname)\Revision$NextRevision\Reports" -Type Directory
    # Перейти к следующей папке проекта.
    # Для этого непроверенного примера цикла требуется PowerShell версии 3.0.
}
 

Установка PowerShell 3.0.

Вот простой способ, который мне помог. Он проверяет, существует ли путь, и если нет, то создает не только корневой путь, но и все подкаталоги:

 $rptpath = "C:\temp\reports\exchange"
if (!(test-path -path $rptpath)) {new-item -path $rptpath -itemtype directory}
 

Я хотел иметь возможность легко позволить пользователям создавать профиль по умолчанию для PowerShell, чтобы переопределить некоторые настройки, и в итоге получил следующую однострочную строку (да, несколько операторов, но их можно вставить в PowerShell и выполнить сразу, что было главная цель):

 класс; [строка]$filePath = $профиль; [string]$fileContents = '<наши стандартные настройки>'; if(!(Test-Path $filePath)){md -Force ([System. IO.Path]::GetDirectoryName($filePath)) | Out-Null; $fileContents | СК $Путь к файлу; Write-Host 'Файл создан!'; } else { Write-Warning 'Файл уже существует!' };
 

Для удобочитаемости я бы сделал это в файле .ps1 следующим образом:

 cls; # Очистите консоль, чтобы лучше видеть результаты
[строка]$filePath = $профиль; # Объявлено как строка, чтобы разрешить использование текстов без plings и при этом не дать сбоев.
[string]$fileContents = '<наши стандартные настройки>'; # Операторы теперь можно писать на отдельных строках, а не через точку с запятой.
если(!(Тест-Путь $filePath)) {
  New-Item -Force ([System.IO.Path]::GetDirectoryName($filePath)) | Out-Null; # Игнорировать вывод создания каталога
  $fileContents | Установить содержимое $filePath; # Создает новый файл с входными данными
  Write-Host 'Файл создан!';
}
еще {
  Пишет-Предупреждение "Файл уже существует! Чтобы удалить файл, выполните команду: Remove-Item $filePath";
};
 
 $mWarningColor = 'Красный'
<# . СИНОПСИС
Создает новый каталог.
.ОПИСАНИЕ
Создает новый каталог. Если каталог уже существует, он будет
не перезаписываться. Вместо этого появится предупреждающее сообщение о том, что каталог уже
существует будет выводиться.
.ВЫХОД
Если каталог уже существует, он не будет перезаписан.
Вместо этого будет выведено предупреждающее сообщение о том, что каталог уже существует.
.ПРИМЕР
Sal-New-Directory -DirectoryPath '.\output'
#>
функция Сал-Новый-Каталог {
параметр(
[параметр (обязательный = $ true)]
[Нить]
$DirectoryPath
)
$ErrorActionPreference = "Стоп"
пытаться {
if (!(Test-Path -Path $DirectoryPath -PathType Container)) {
# Sal-New-Directory не предназначен для приема нескольких
# каталоги. Однако мы используем foreach для подавления собственного вывода.
# и замените на собственное сообщение.
New-Item -Path $DirectoryPath -ItemType Контейнер | `
foreach {'Создано' + $_.