Создать каталог 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. Вы также можете ознакомиться со следующими статьями, чтобы узнать больше:
- PowerShell Uptime
- Powershell Remotesigned
- Служба запуска PowerShell
- 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 {'Создано' + $_.