Copy-Item正在复制意外的文件夹

时间:2019-04-01 03:57:03

标签: powershell copy directory-structure

我正在努力了解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 :(得分:0)

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

答案 1 :(得分:0)

您不测试目标文件夹是否存在。看到您正在使用当前日期创建其名称,很可能该文件夹尚不存在,因此您需要首先创建它。

此外,由于New-PSDrive完全能够使用UNC路径,因此不必使用Copy-Item cmdlet。

可能是这样的:

$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
}