测试路径和文件(嵌套IF)

时间:2014-12-10 22:03:05

标签: powershell if-statement

漫长的一天,可能会遗漏一些明显的东西,但下面嵌套的IF语句应该有效。有什么建议吗?

基本上,我想做的是:

  1. 获取一个给定的主机名(稍后将合并到一个循环中)。
  2. 获取一个日志文件并将其从一个位置移动到另一个位置(位置始终不变)
    • 2A。测试文件夹是否存在:
      • 2A-1。如果文件夹存在,请测试文件是否在文件夹中
        • 2A-1a上。 True:删除文件
        • 2A-1b中。错误:将文件复制到该文件夹​​。
      • 2A-2。否则:将文件复制到该文件夹​​。
    • 2B。 ELSE:
      • 2B-1。创建文件夹。
      • 2B-2。将文件复制到文件夹
  3. 我做了以下事情:

    $Computer = "hostName"
    
    Enter-PSSession -ComputerName $($Computer)
    
    $LogFileName = "program_" + $Computer + ".log"
    $LogFilePath = "\\$Computer\C$\users\$env:USERNAME\desktop\$LogFileName"
    $DestPath = "\\$Computer\C$\users\$env:USERNAME\ProgramTest\"
    $LogCopy = "programCopy_" + $Computer + ".log"
    
    IF(Test-Path $($DestPath)){
       If(Test-Path "$DestPath\$LogCopy"){
          Remove-Item "$DestPath\$LogCopy"
          Copy-Item $($LogFilePath) $($DestPath)
           }
       Else{
           Copy-Item $($LogFilePath) $($DestPath)
          }
    ELSE{
       New-Item -ItemType directory -Path $($DestPath)
       Copy-Item $($LogFilePath) $($DestPath)
       }
    }
    

2 个答案:

答案 0 :(得分:4)

我看到你已经接受了答案,但我想提供和改进逻辑。嵌套的if虽然可以正常工作但却有一些冗余。假设我理解你的意图......

# If the folder does not exist create it. If it does move on
If(!(Test-Path $DestPath)){New-Item -ItemType directory -Path $DestPath}

# If the log file already exists. Remove It. 
If(Test-Path "$DestPath\$LogCopy"){Remove-Item "$DestPath\$LogCopy"}

# Regardless of what happens we are going to copy the file. No need to repeat the code. 
Copy-Item $($LogFilePath) $($DestPath)

虽然这是对逻辑的改进,但我们可以更进一步。如果你想确保文件是新的并且被覆盖Copy-Item将为你处理。

# If the folder does not exist create it. If it does move on
If(!(Test-Path $DestPath)){New-Item -ItemType directory -Path $DestPath}

# Regardless of what happens we are going to copy the file. No need to repeat the code. 
Copy-Item $LogFilePath $DestPath -Confirm:$false -Force

$()是子表达式的表示法。类似上下文中的常见用法是确保变量在字符串中正确扩展。如以下示例所示

PS C:\Users\Cameron> $data = @{Matt="Awesome"}

PS C:\Users\Cameron> "$data.Matt"
System.Collections.Hashtable.Matt

PS C:\Users\Cameron> "$($data.Matt)"
Awesome

目前在您的代码中,虽然没有造成任何伤害,但它是多余的。

答案 1 :(得分:0)

除了$($Variable)的可疑使用(完全冗余;只是使用$Variable)之外,你错放了一个右大括号。最后五行应如下所示:

}
ELSE{
    New-Item -ItemType directory -Path $($DestPath)
    Copy-Item $($LogFilePath) $($DestPath)
}

如果这不起作用,请告诉我们实际发生了什么:错误等等,当您尝试运行它时。