Copy-Item копирует неожиданную папку - PullRequest
0 голосов
/ 01 апреля 2019

Мне трудно понять, как PowerShell обрабатывает рекурсию и команду Copy-Item.

$date=Get-Date -Format yyyyMMdd
$oldfolder="c:\certs\old\$date"
New-PSDrive -Name "B" -PSProvider FileSystem -Root "\\(server)\adconfig"
$lastwrite = (get-item b:\lcerts\domain\wc\cert.pfx).LastWriteTime
$timespan = new-timespan -days 1 -hours 1

Write-Host "testing variables..."
Write-Host " date = $date" `n "folder path to create = $oldfolder" `n 
"timespan = $timespan"

if (((get-date) - $lastwrite) -gt $timespan) {
#older
Write-Host "nothing to update."
}
else {
#newer
Write-Host "newer certs available, moving certs to $oldfolder"
copy-item -path "c:\certs\wc" -recurse -destination $oldfolder 
copy-item b:\lcerts\domain\wc\ c:\certs\ -recurse -force
}

Существующие файлы существуют в c:\certs\wc\cert.pfx У меня есть «тест», сравнивающий время между cert.pfx в папке b:\lcerts\domain\wc\ и текущим временем.Если сертификат был изменен за последние 1 день и 1 час, сценарий должен продолжаться:

Копировать cert.pfx из c:\certs\wc\ to c:\certs\old\$date\cert.pfx

Копировать cert.pfx из b:\lcerts\domain\wc to c:\certs\wc\cert.pfx

Я, очевидно, не понимаю номенклатуру PowerShell для этого, потому что при первом запуске этого скрипта он работает нормально.Во второй раз он создает другую папку внутри c:\certs\wc\$date\wc\cert.pfx.

Как заставить его завершиться с ошибкой с "c:\certs\wc\$date\cert.pfx уже существует? "

Я не хочу ограничивать это только файлом cert.pfx, указав фактическое имя файла, яхотите, чтобы все файлы в папке, так как в конечном итоге будет более одного файла.

Ответы [ 2 ]

0 голосов
/ 01 апреля 2019

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

Кроме того, не нужно использовать New-PSDriveкомандлет, потому что Copy-Item прекрасно умеет использовать UNC-пути.

Возможно, что-то вроде этого:

$server      = '<NAME OF THE SERVER>'
$serverPath  = "\\$server\adconfig\lcerts\domain\wc"
$testFile    = Join-Path -Path $serverPath -ChildPath 'cert.pfx'
$localPath   = 'c:\certs\wc'
$date        = Get-Date -Format yyyyMMdd
$timespan    = New-TimeSpan -Hours 1 -Minutes 1
$oldfolder   = "c:\certs\old\$date"

# check if this output path exists. If not, create it
if (!(Test-Path -Path $oldfolder -PathType Container)) {
    Write-Host "Creating folder '$oldfolder'"
    New-Item -ItemType Directory -Path $oldfolder | Out-Null
}

Write-Host "testing variables..."
Write-Host "date = $date`r`nfolder path to create = $oldfolder`r`ntimespan = $timespan"

# test the LastWriteTime property from the cert.pfx file on the server
$lastwrite = (Get-Item $testFile).LastWriteTime
if (((Get-Date) - $lastwrite) -gt $timespan) {
    #older
    Write-Host "Nothing to update."
}
else {
    #newer
    Write-Host "Newer cert(s) available; copying all from '$localPath' to '$oldfolder'"
    Copy-Item -Path $localPath -Filter '*.pfx' -Destination $oldfolder
    Copy-Item -Path $serverPath -Filter '*.pfx' -Destination $localPath -Force
}   
0 голосов
/ 01 апреля 2019

Поведение Copy-Item, когда каталог указан в параметре -Path, зависит от того, существует ли каталог, указанный в параметре -Destination.

Copy-Item -Path "c:\certs\wc" -Recurse -Destination "c:\certs\old\$date"

Если каталог c:\certs\old\$date существуетне существует, то каталог wc копируется с именем c:\certs\old\$date.

Если каталог c:\certs\old\$date существует, каталог wc копируется в каталог c:\certs\old\$date.Таким образом, он становится c:\certs\old\$date\wc.

Поэтому вы обязательно должны проверить заранее, существует ли каталог.

if(Test-Path $oldfolder) { throw "'$oldfolder' is already exists." }
Copy-Item -Path "c:\certs\wc" -Destination $oldfolder -Recurse
...