尝试使用嵌套的ElseIf语句编写Powershell脚本,脚本未按预期执行

unftdfkk  于 2023-03-09  发布在  Shell
关注(0)|答案(1)|浏览(119)

我想先声明一下,我不是最精通Powershell脚本的人。
我编写了一个脚本,使用系统日期函数根据系统日期确定要将下载文件夹复制到哪些驱动器。虽然脚本部分工作,但它只成功复制了D驱动器和E驱动器 ,而不考虑系统日期
这就好像ElseIf语句中列出的其他驱动器没有被读取或考虑。我很好奇我的语句是否嵌套不正确,或者没有足够的括号正确插入到代码中,因为我不是很精通编写Powershell语句脚本。我还研究了使用开关函数的可能性,如果这对这种脚本可行,并会提供更好的结果。此外,它是四个驱动器,将循环在一个五天的一周(星期一到星期五)。这就是为什么我还包括一个周末日期变量到我的powershell脚本。
下面列出的是我当前的powershell脚本。

$TodaysDate = [DateTime]::Today.ToString("yyyy-MM-dd")
$YesterdaysDate = [DateTime]::Today.AddDays(-1).ToString("yyyy-MM-dd")
$WeekendDate = [DateTime]::Today.AddDays(-3).ToString("yyyy-MM-dd")

If ("D:\SNAProBackupTest\backups $YesterdaysDate" -Or "D:\SNAProBackupTest\backups $WeekendDate")
{
    md "E:\SNAProBackupTest\backups $TodaysDate"
    XCOPY   "C:\Users\daniel presnell\Downloads"  "E:\SNAProBackupTest\backups $TodaysDate"
}
ElseIf ("E:\SNAProBackupTest\backups $YesterdaysDate" -Or "E:\SNAProBackupTest\backups $WeekendDate")
{
    md "F:\SNAProBackupTest\backups $TodaysDate"
    XCOPY   "C:\Users\daniel presnell\Downloads" "F:\SNAProBackupTest\backups $TodaysDate"
}
ElseIf ("F:\SNAProBackupTest\backups $YesterdaysDate" -Or "F:\SNAProBackupTest\backups $WeekendDate")
{
    md "G:\SNAProBackupTest\backups $TodaysDate"
    XCOPY   "C:\Users\daniel presnell\Downloads" "G:\SNAProBackupTest\backups $TodaysDate"
}
ElseIf ("G:\SNAProBackupTest\backups $YesterdaysDate" -Or "G:\SNAProBackupTest\backups $WeekendDate")
{
    md "D:\SNAProBackupTest\backups $TodaysDate"
    XCOPY   "C:\Users\daniel presnell\Downloads" "D:\SNAProBackupTest\backups $TodaysDate"
}

ECHO Backup Complete!

运行此脚本时,D:\和E:\将根据系统日期成功运行,但其他驱动器(F:\和G:\)将无法正常运行或工作。周末将不执行备份,因此添加了周末日期变量。为此目的,开关函数是否更可行?我的语句嵌套是否正确?非常感谢您抽出时间来查看此问题。

wj8zmpe1

wj8zmpe11#

PowerShell中的任何非空字符串都被认为是 truthy,这意味着您的if和elseif条件始终都是 all true
您可以在交互式环境中观察到这一点,方法是将-or运算符与任意两个字符串操作数一起使用,只要其中至少有一个非空:

PS ~> "literally anything" -or ""
True

要测试给定字符串是否为可解析路径,请使用Test-Path cmdlet:

If ((Test-Path "D:\SNAProBackupTest\backups $YesterdaysDate") -Or (Test-Path "D:\SNAProBackupTest\backups $WeekendDate"))
{
    md "E:\SNAProBackupTest\backups $TodaysDate"
    XCOPY   "C:\Users\daniel presnell\Downloads"  "E:\SNAProBackupTest\backups $TodaysDate"
}

如果路径未解析为实际的文件系统项,则Test-Path将返回$false
对else-if条件重复上述步骤
我还必须指出,您的代码可以大大简化,因为您基本上只是使用不同的驱动器号重复自己的代码:

# These date strings remain the same as before
$TodaysDate = [DateTime]::Today.ToString("yyyy-MM-dd")
$YesterdaysDate = [DateTime]::Today.AddDays(-1).ToString("yyyy-MM-dd")
$WeekendDate = [DateTime]::Today.AddDays(-3).ToString("yyyy-MM-dd")

# Now let's define a list of possible existing drives and the next target drives
$driveLetters = 'D E F G'.Split()

# now we just repeat the same operation for each drive and backup to the next drive in the list:
for($i = 0; $i -lt $driveLetters.Count; $i++){
  $testDrive = $driveLetters[$i]
  $targetDrive = $driveLetters[($i + 1) % $driveLetters.Count]

  if((Test-Path "${testDrive}:\SNAProBackupTest\backups $YesterdaysDate") -or (Test-Path "${testDrive}:\SNAProBackupTest\backups $WeekendDate"))
  {
    $newDirPath = "${targetDrive}:\SNAProBackupTest\backups $TodaysDate"
    md $newDirPath
    xcopy "C:\Users\daniel presnell\Downloads" $newDirPath

    # our work here is done, break out of loop
    break
  }
}

Write-Output 'Backup Complete!'

$driveLetters[($i + 1) % $driveLetters.Count]语句确保在到达列表末尾时“绕回”,以便GMap回D

相关问题