Назад | Перейти на главную страницу

Есть ли лучший способ написать этот сценарий PowerShell?

Ниже приведен мой сценарий Powershell для удаления определенных файлов резервных копий на моих серверах и последующего отображения их содержимого. Много повторений. Есть ли более эффективный способ выполнить эту задачу?

Remove-Item \\ietg\z$\Backups\daily\ETG*.bkf -Force -Confirm 
Remove-Item \\icnt\Z$\Backups\Daily\cnt*.bkf -Force -Confirm
Remove-Item \\igre\Z$\Backups\Daily\gre*.bkf -Force -Confirm
Remove-Item \\ihvd\Z$\Backups\Daily\hvd*.bkf -Force -Confirm
Remove-Item \\iklr\Z$\Backups\Daily\klr*.bkf -Force -Confirm

Get-ChildItem \\ietg\z$\Backups\daily\
Get-ChildItem \\icnt\Z$\Backups\Daily\
Get-ChildItem \\igre\Z$\Backups\Daily\
Get-ChildItem \\ivd\Z$\Backups\Daily\
Get-ChildItem \\iklr\Z$\Backups\Daily\

Один из способов - прочитать сценарий в другом файле для пар значений. Это упростит сценарий и значительно упростит обслуживание.

Входной файл:

Server,filename
ietg,ETG
icnt,cnt
igre,gre
ihvd,hvd
iklr,klr

Потом что-то вроде этого (верхняя часть головы, не запускать. Вот и ошибки)

$Targets=Import-CSV -File "Input.csv"
Foreach ($Targ in $Targets) {
    $Child=""\\"+$Targ.Server+"\Z$\Backups\daily\"+$Targ.filename
    $Server=$Child+"*.bkf"
    Remove-Item $Server -Force -Confirm
    Get-ChildItem $Child
}

Строить струны почти наверняка проще. Ключевым моментом здесь является импорт CSV и цикл.

Если вы предпочитаете делать все в одном файле, вы можете создать $Targets вручную довольно просто:

$Targets[0]= @{"Server" = "ietg"; "filename" = "ETG"}
$Targets[1]= @{"Server" = "icnt"; "filename" = "cnt"}
$Targets[2]= @{"Server" = "igre"; "filename" = "gre"}
## and so on

Другой способ сохранить данные в одном файле - построить хеш из двух массивов ...

$servers={"ietg", "icnt", "igre", "ihvd", "iklr"}
$filenames={"ETG", "cnt", "gre", "hvd", "klr"}
$Targets = @{}
if ($servers.Length -ne $filenames.Length) {
    Write-Error -Message "Array lengths do not match" `
                -Category InvalidData `
                -TargetObject $values
} else {
    for ($i = 0; $i -lt $keys.Length; $i++) {
        $Targets[$keys[$i]] = $values[$i]
    }
}
# the rest is from @sysadmin1138's post...
Foreach ($Targ in $Targets) {
    $Child=""\\"+$Targ.Server+"\Z$\Backups\daily\"+$Targ.filename
    $Server=$Child+"*.bkf"
    Remove-Item $Server -Force -Confirm
    Get-ChildItem $Child
}

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

$servers={"ietg", "icnt", "igre", "ihvd", "iklr"}
$Targets = @{}
$servers | %{ $Targets.Add( $_, $_.Substring(1,3) ) }
# continue same as above starting from "Foreach ($Targ..."