Переключить параметр и оператор If - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь использовать значение параметра switch в качестве триггера для записи в файл csv, если параметр вызывается с помощью сценария из командной строки. Тем не менее, с моим текущим кодом CSV-файл создается независимо от того, включаю я параметр или нет. Что с этим?

Кроме того, есть ли лучший способ обработать мой раздел else / if else / if else?

[CmdletBinding()]
param (
    [Parameter(Mandatory=$true)]
    [string]$dir,
    [Parameter(Mandatory=$true)]
    [int]$days,
    [switch]$csv=$false
)

Process {
    Clear-Host
    $totSize = 0
    $totFiles = 0
    $modDate = (Get-date).AddDays(-$days).Date
    $modfiles = Get-ChildItem -Path $dir -Recurse -ErrorAction SilentlyContinue | Where-Object { $_.LastWriteTime -ge $modDate } 
    If ($csv = $true){
        $modfiles | Select-Object -Property FullName, Length,LastWriteTime | Export-Csv -Path .\modFiles.csv -NoTypeInformation
    }
    foreach ($file in $modfiles){
        $totFiles = $totFiles + 1
        $totSize = $totSize + $file.Length 
    }

    If ($totSize -lt 1MB){
        $outSize = $totSize/1KB
        $unit = "KB"
    }
    elseif (($totSize -ge 1MB) -and ($totSize -lt 1GB)){
        $outSize = $totSize/1MB
        $unit = "MB"   
    }
    elseif ($totSize -ge 1GB){
        $outSize = $totSize/1GB
        $unit = "GB" 
    } 

    $outRound = [math]::Round($outSize,2)
    Write-Host $totFiles "Files"
    Write-Host $outRound $unit
}

1 Ответ

3 голосов
/ 18 февраля 2020

Две проблемы.

  1. Не указывайте значение по умолчанию для параметра [switch]. Это испортит тебя. Оставьте его выключенным, и оно будет $ true, если указано, и $ false, если нет.
  2. При тестировании логического значения, такого как оператор If, не используйте присвоение, равное (=), используйте сравнение равно (-eq).
If ($csv -eq $true){
    $modfiles | Select-Object -Property FullName, Length,LastWriteTime | Export-Csv -Path .\modFiles.csv -NoTypeInformation
}

РЕДАКТИРОВАТЬ (спасибо @Scepticalist): Кроме того, если проверяемая переменная уже содержит значение [bool] или может быть неявно преобразована в [bool] вам даже не нужна часть -eq $true сравнения, поэтому:

If ($csv){
        $modfiles | Select-Object -Property FullName, Length,LastWriteTime | Export-Csv -Path .\modFiles.csv -NoTypeInformation
    }
...