if else语句过多

时间:2019-03-22 13:22:48

标签: powershell

我正在尝试检查文件“ .sql”或“ .txt”是否存在字符串“ 03-22-2019”(或不存在,并在输出中显示结果)。

execution\development\process.sql
insert.sql
production\logs.txt
restore.sql
rebuild.txt

我正在尝试使用下面的代码,但是我做了太多的{​​{1}}。上面的文件路径存储在if else变量中。我需要用“ \”分割路径,并获取路径的最后一部分来做其他事情。

$paths

2 个答案:

答案 0 :(得分:0)

看起来您应该在$ paths变量之后以foreach开头,如下所示:

foreach ($path in $paths) {
    if ($path -like "*.sql") {    #Note the use of one single item in the $paths array you have
        $last = $path.split("\")[-1]
        $result = #Whatever method you want to use to return a DateTime object
        if ($result) { #### Now, this line doesn't make any sense. Do you want to compare a date to an older date or something? Maybe something like "if ($result -ge (Get-Date).addDays(-1) )
        { # Do your stuff }

做类似的事情:

if ($paths -like "*.sql")

不起作用,因为$ paths是一个数组,并且您正在进行字符串比较,并且永远不会满足。现在,如果您要查找文件中是否包含字符串,则应使用“ Get-Content”或“ Import-Csv”之类的

您可以使用“ Get-Date” cmdlet获取日期的许多不同格式。了解有关该here的信息。如果您要比较多个文件的多个日期,那么我将像在上面那样对文件进行for循环,然后在每个文件上的for循环 来获取日期数组。也许是这样的:

foreach ($path in $paths) {
    foreach ($date in $dates) { 
        # Get the contents of a file and store it in a variable
        # Search for the string in that variable and store the results in a variable
        # Write to the console
    } # End foreach ($date in $dates)
} # End foreach ($path in $paths)

发布更多更新的代码,让我们看看您的想法。

答案 1 :(得分:0)

我会简化一点,下面是确定文件是否包含日期的示例:

$paths = @("c:\path1","c:\path2\subdir")
ForEach ($path in $paths) {
    $files = Get-ChildItem -LiteralPath $path -file -include "*.sql","*.txt"
    $last = ($path -split "\\")[-1] # contains the last part of the path
    $output = ForEach ($file in $files) {
        If (Select-String -path $file -pattern "03-22-2019") {
        "$($file.fullname) contains the date."
        }
        else {
        "$($file.fullname) does not contain the date."
        }
    }
}

$output # outputs whether or not a file has the date string

外部ForEach循环遍历$paths中的路径。在该循环内,您可以对每个路径$path执行所需的操作。我使用$last来存储当前迭代中路径的最后一部分。您还没有说要怎么做。

内部ForEach检查每个 .txt .sql 文件中的日期文本03-22-2019。 $output存储一个字符串,该字符串指示每个 .txt .sql 文件是否包含日期字符串。

如果您的路径包含文件名,则可以使用以下替代方法来获取文件名(路径的最后一部分):

$path | split-path -leaf # inside of the outer ForEach loop
# Or
$file.name # inside of the inner ForEach loop