0

我对 PowerShell 相当陌生。我创建了一个可以由同事运行的 exe,它将转到 8 个单独的 sql 服务器,到各个目录并检查它们以获取已创建文件的列表。我当前的代码检查年龄小于一天并且它不是空的,但是,我遇到了一个新问题。我需要能够在文本文件/array/csv/etc 中获取列表并将列表与目录进行比较,以确保文件夹中没有任何其他文件。然后将所有信息格式化,导出到文件,然后通过电子邮件发送给某些收件人。

我的问题是,我如何创建一个使用这个想法的脚本;最好不要对我当前的代码进行相当大的更改,因为考虑到 8 个 sql 服务器的子目录,它的长度相当长。(当前编辑的脚本如下):

$today = get-date
$yesterday = $today.AddDays(-1)
$file_array = "XXX_backup*.trn", "XXX_backup*.bak", "XXY_backup*.trn", "XXY_backup*.bak"

$server_loc = \\hostname\e$\

$server_files = @(get-childitem $server_loc | where-object {$_.fullname -notmatch "(subdirectory)})

$server_complete_array = @("Files Directory ($server_loc)", " ")

foreach ($file in $files) {
    IF ($file.length -eq 0) {
        [string]$string = $file
        $server_complete_Array = $server_complete_Array + "$string is empty."
        }
elseif ($file.LastWriteTime -lt $yesterday) {
        [string]$string = $file
        $server_complete_Array = $server_complete_Array + "$string is old."
        }
else {
        [string]$string = $file
        $server_complete_Array = $server_complete_Array + "$string is okay."}
}

提前谢谢你的帮助。:)

4

1 回答 1

0

有点hack,但它应该适用于你已经拥有的东西:

$file_array = "XXX_backup*.trn", "XXX_backup*.bak", "XXY_backup*.trn", "XXY_backup*.bak"

$FileNames = $server_files | select -ExpandProperty Name
$FileCheck = ('$Filenames ' + ($file_array | foreach {"-notlike '$_'"}) -join ' ')

由于您已经在文件规范中使用通配符,因此可以通过创建一个命令来使用通配符,该命令通过一系列 -notlike 运算符过滤文件名数组,每个文件规范一个。

$FileCheck

$Filenames -notlike 'XXX_backup*.trn' -notlike 'XXX_backup*.bak' -notlike 'XXY_backup*.trn' -notlike 'XXY_backup*.bak'

每个都将过滤掉与文件规范匹配的名称,并将其余的传递给下一个 -notlike 运算符。无论最后掉出来的东西都不匹配他们中的任何一个

此时 $FileCheck 只是一个字符串,您需要使用 Invoke-Expression 来运行它。

$ExtraFiles = Invoke-Expression $FileCheck

然后 $ExtraFiles 应该包含与 $file_array 中的任何文件规范不匹配的所有文件的名称。由于过滤器是从 $file_array 创建的,因此如果您从数组中添加或删除文件规范,则无需进行其他维护。

于 2014-05-06T22:29:22.447 回答