Как можно скопировать файлы, соответствующие определенным условиям?

У меня есть папка G:\DOCS, содержащая подкаталоги, названия которых соответствуют формату "Товарная накладная № Х от 01.01.2024". Также в этой папке создана папка G:\DOCS\2024. Мне нужно перенести все папки, названия которых заканчиваются на "2024", в папку "2024". Несмотря на то, что задача кажется простой, я не могу найти способ её выполнить. Не могли бы вы помочь? <br/> <br/> Я открыт к решениям как с использованием батника, так и через PowerShell.
  • 18 апреля 2025 г. 9:25
Ответы на вопрос 2
Да, я могу помочь с этой задачей. Вы можете выполнить ее как с помощью пакетного файла (батника), так и с помощью PowerShell. Вот решения для обоих методов:

### Метод 1: BAT-файл

Создайте текстовый файл с расширением `.bat`, например `move_folders.bat`, и вставьте в него следующий код:

```batch
@echo off
setlocal enabledelayedexpansion

set "source=G:\DOCS"
set "destination=G:\DOCS\2024"

for /d %%f in ("%source%\*") do (
    set "foldername=%%~nxf"
    if "!foldername:~-4!"=="2024" (
        move "%%f" "%destination%"
    )
)

endlocal
```

**Описание:**
- `setlocal enabledelayedexpansion`: включает расширение переменных.
- `for /d %%f in ("%source%\*") do`: перебирает все подкаталоги в указанной исходной папке.
- `set "foldername=%%~nxf"`: сохраняет имя текущей папки в переменной.
- `if "!foldername:~-4!"=="2024"`: проверяет, заканчивается ли имя папки на "2024".
- `move "%%f" "%destination%"`: перемещает папку в целевую директорию.

### Метод 2: PowerShell

Откройте PowerShell и выполните следующую команду:

```powershell
$source = "G:\DOCS"
$destination = "G:\DOCS\2024"

Get-ChildItem -Path $source -Directory | Where-Object { $_.Name.EndsWith("2024") } | Move-Item -Destination $destination
```

**Описание:**
- `Get-ChildItem -Path $source -Directory`: получает список всех подкаталогов в исходной папке.
- `Where-Object { $_.Name.EndsWith("2024") }`: фильтрует только те папки, названия которых заканчиваются на "2024".
- `Move-Item -Destination $destination`: перемещает отфильтрованные папки в целевую директорию.

### Запуск

- Для BAT-файла просто дважды щелкните на созданный файл, чтобы запустить его.
- Для PowerShell вы можете вставить команду в окно PowerShell и нажать Enter.

Выберите любой из предложенных методов, который вам больше подходит!
сохранить  в *.ps1 

# Определяем путь к папке с документами и папке назначения
$sourcePath = "G:\DOCS"
$destinationPath = "G:\DOCS\2024"

# Проверяем, существует ли папка назначения, если нет – создаем её
if (-Not (Test-Path -Path $destinationPath)) {
try {
New-Item -ItemType Directory -Path $destinationPath
Write-Host "Создана папка назначения: $destinationPath"
} catch {
Write-Host "Ошибка при создании папки: $_"
exit
}
}

# Получаем список всех папок в исходной директории, которые заканчиваются на 2024
$foldersToMove = Get-ChildItem -Path $sourcePath -Directory | Where-Object { $_.Name -like "*2024" }

# Проверяем, есть ли папки для перемещения
if ($foldersToMove.Count -eq 0) {
Write-Host "Не найдено папок для перемещения."
exit
}

# Перемещаем папки в папку назначения
foreach ($folder in $foldersToMove) {
try {
Move-Item -Path $folder.FullName -Destination $destinationPath -Force
Write-Host "Перемещена папка: $($folder.FullName) в $destinationPath"
} catch {
Write-Host "Ошибка при перемещении папки: $($folder.FullName) - $_"
}
}

Write-Host "Процесс перемещения завершен."
Похожие вопросы