Powershell Copy-Item — исключать, только если файл существует в месте назначения

Ниже приведен точный сценарий в моем сценарии powershell.

$Source = "C:\MyTestWebsite\"
$Destination = "C:\inetpub\wwwroot\DemoSite"
$ExcludeItems = @(".config", ".csproj")

Copy-Item "$Source\*" -Destination "$Destination" -Exclude $ExcludeItems -Recurse -Force

Я хочу, чтобы этот код копировал файлы .config и .csproj, если они не существуют в папке назначения. Текущий сценарий просто исключает их независимо от того, существуют они или нет. Цель состоит в том, что я не хочу, чтобы скрипт перезаписывал файлы .config и .csproj, но он должен копировать их, если они не существуют в месте назначения.

Любая идея о том, какие исправления требуются в сценариях?

Любая помощь в этом будет высоко оценена.

Спасибо


person Nirman    schedule 18.11.2014    source источник
comment
Какой-то оператор If, использующий Test-Path, кажется уместным.   -  person GodEater    schedule 18.11.2014
comment
Это похоже на работу для Robocopy, а не на сценарий PowerShell.   -  person alroc    schedule 18.11.2014


Ответы (3)


Это должно быть довольно близко к тому, что вы хотите сделать

$Source = "C:\MyTestWebsite\"
$Destination = "C:\inetpub\wwwroot\DemoSite"

$ExcludeItems = @()
if (Test-Path "$Destination\*.config")
{
    $ExcludeItems += "*.config"
}
if (Test-Path "$Destination\*.csproj")
{
    $ExcludeItems += "*.csproj"
}

Copy-Item "$Source\*" -Destination "$Destination" -Exclude $ExcludeItems -Recurse -Force
person Micky Balladelli    schedule 18.11.2014

Решение SKaDT сработало для меня.

Copy-Item -Path (Get-ChildItem -Path E:\source\*.iso).FullName -Destination E:\destination -Exclude (Get-ChildItem -Path E:\destination\*.iso).Name -Verbose

(Get-ChildItem -Path E:\source\*.iso).FullName соберет все исходные файлы с полным диском, путем и именами файлов. С параметром -Exclude (Get-ChildItem -Path E:\destination\*.iso).Name собирает все файлы *.iso в папке назначения и исключает их все. Результат: скопируйте все файлы *.iso из источника в место назначения, но исключите все файлы *.iso, существующие в папке назначения.

person Upo001    schedule 28.01.2021

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

Copy-Item -Path (Get-ChildItem -Path E:\source\*.iso).FullName -Destination E:\destination -Exclude (Get-ChildItem -Path E:\destination\*.iso).Name -Verbose

командлет получает все файлы в папке по маске (*.iso), после этого ищет папку назначения и исключает все имена файлов, которые существуют в папке назначения

person SKaDT    schedule 28.08.2018
comment
Добро пожаловать! Пожалуйста, включите объяснение с вашим ответом. Ответы, содержащие только код, отправляются в очередь проверки сообщений низкого качества для возможного удаления. Вы всегда можете отредактировать и улучшить свой ответ. - person Zev; 28.08.2018