Поиск по сайту:

Как переместить файл с помощью PowerShell


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

Перемещение файлов — это довольно распространённая задача, вы можете, например, захотеть архивировать все файлы старше x дней в другое место. Используя PowerShell, мы можем написать скрипт и запланировать его выполнение автоматически.

В этой статье я объясню, как вы можете переместить файл с помощью PowerShell и приведу вам несколько примеров.

Переместить файл с помощью PowerShell

Перемещение одного файла с помощью PowerShell выполняется с помощью команды Move-Item. Она требует указания пути к исходному файлу и места назначения для его перемещения. Пример ниже перемещает файл readme.txt в папку d:\archive:

Move-Item -Path "C:\temp\files\readme.txt" -Destination "D:\archive\"

Важно отметить, что папка назначения должна заканчиваться на \. Это необходимо, потому что если папка назначения, archive в данном случае, не существует, то PowerShell переместит файл в D:\ и назовет его archive без каких-либо расширений.

Если вы хотите увидеть, какие файлы копируются в консоли, вы можете использовать параметр -PassThru. Это выведет объект со всеми файлами, которые были перемещены.

Перемещение всех файлов в папке

Вы можете переместить все файлы в папке, используя символ подстановки *. Если вы хотите переместить только файлы, а не подкаталоги, тогда используйте *.* в параметре пути:

Move only all the files
Move-Item -Path "C:\temp\files\*.*" -Destination "D:\archive\"

Чтобы переместить все подпапки и их содержимое, вы можете просто использовать * в качестве подстановочного знака:

move all files and subfodlers
Move-Item -Path "C:\temp\files\*" -Destination "D:\archive\"

Перемещение определённых файлов

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

Move-Item -Path "C:\temp\files\*.csv" -Destination "D:\archive\"

В приведенном выше примере только файлы CSV из заданной папки перемещаются в место назначения. Если вы хотите переместить файлы CSV из подпапок, то сначала нам нужно получить все элементы с помощью команды Get-ChildItem.

Команда Get-ChildItem получит все элементы из указанного пути. С помощью параметра -Recurse она также получит все элементы из подпапок. Затем мы можем передать команду Move-Item, чтобы переместить выбранные файлы в новое место назначения:

Get-ChildItem -Path "C:\temp\files\*.csv" -Recurse | Move-Item -Destination "D:\archive\"

Использование параметров Включить и Исключить

Команда Move-Item имеет параметры -Include и -Exclude, которые вы можете использовать. Они позволяют вам указать типы файлов, которые вы хотите переместить или не перемещать в пункт назначения.

Move-Item -Path "c:\temp\files\*" -Include "*.txt","*.csv" -Destination "d:\archive\"

Теперь, если вы пытаетесь использовать эти параметры в PowerShell 5.x, вы, вероятно, заметите, что он выдает ошибку, “… не существует” для всех элементов, которые не соответствуют параметрам включения или исключения.

Проблема решена в PowerShell 7, но если вы используете PowerShell 5.x, то вы можете обойти эту проблему, сначала использовав командлет Get-ChildItem. Другой вариант - указать несколько путей со всеми типами файлов, которые вы хотите переместить:

Move-Item -Path "c:\temp\files\*.csv", "c:\temp\files\*.txt" -Destination "d:\archive\"

Принудительная перезапись файлов

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

Примеры файлов для продвинутых перемещений

Теперь у вас должна быть хорошая идея о базовых принципах, когда речь идет о cmdlet move-item. Давайте рассмотрим несколько более сложных примеров.

Перемещение файлов старше x дней

Распространенной практикой при очистке каталогов является архивирование только тех файлов, которые старше x дней. Для этого нам сначала нужно рассчитать дату файла. Допустим, мы хотим архивировать или переместить все файлы, которые старше 30 дней, тогда нам сначала нужно получить дату, которая была 30 дней назад:

Get the date from today minus 30 days

$dateTime = (Get-Date).AddDays(-30)

Следующий шаг - получить все файлы, которые старше заданной даты. Для этого мы будем сравнивать lastwritetime файла с datetime, которую мы рассчитали:

Get-ChildItem -Path $Path -Recurse -File | Where-Object { $_.LastWriteTime -lt $dateTime }

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

$dateTime = (Get-Date).AddDays(-30)
$path = "C:\temp\files\"

Move all files from the given path and subfolders that are older than 30 days
Get-ChildItem -Path $Path -Recurse -File | Where-Object { $_.LastWriteTime -lt $dateTime } | Move-Item -Destination "D:\archive\"

Переместить файлы размером более чем

Еще одно общее действие — переместить только большие файлы из данной папки. Так же, как и с перемещением только старых файлов, сначала мы получим элементы с помощью команды Get-ChildItem.

$path = "C:\temp\files\"

Set file size
$sizeInMb = 500

Calculate actual file size
$size = $sizeInMb*1024*1024

Move all files that are larger then given size
Get-ChildItem -Path $Path -Recurse -File | Where-Object { $_.length -gt $size } | Move-Item -Destination "D:\archive\"

Заключение

Перемещение файлов с помощью команды Move-Item довольно просто. Если вы хотите выбрать только определенные файлы или хотите использовать расширенные файлы, вы можете использовать команду Get-ChildItem, чтобы выбрать необходимые файлы.

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

Надеюсь, вам понравилась эта статья, не забудьте подписаться на новостную рассылку или следовать за мной на Facebook, чтобы получать последние статьи. Если у вас есть какие-либо вопросы, просто оставьте комментарий ниже.