$ false时执行$ true语句

时间:2015-12-21 23:05:29

标签: powershell if-statement powershell-v3.0

我在使用PowerShell脚本时遇到了一些麻烦。这样做的目的是蜘蛛网络并查找任何PC上存在的文件/文件夹。

以下是原始资料来源:

#FiToFin Script#
$Fltr = "how_recover*.*"
$Online = "C:\Users\<username>\Scripts\Logs\Online.log"
$CSV = "C:\Users\<username>\Scripts\Devices.csv"
#$Tstpath = test-path "\\$computer\c$"
$Offline = "C:\Users\<username>\Scripts\Logs\Offline.log"
##################################################
$devices = Get-Content "$CSV"
foreach ($computer in $devices) {
  Test-Path "\\$computer\c$" > $Tstpath
  if ($Tstpath -eq $True) {
    ls -Path "\\$computer\c$\users" -Filter $Fltr -Recurse |
      Out-File -Append $Online
  } else {
    Write-Host "$computer is NOT Online" | Out-File -Append $Offline
  }
}
##################################################
Write-Host "_____________________"
Write-Host "Online file = $Online"
Write-Host "Offile file = $Offline"
Write-Host "_____________________"

我已将if语句更改为if($Tstpath -eq "True")if ($lastexitcode -eq $true)if($Tstpath -eq $false),无论如何,它们都只是解析第一个{Do command}。他们永远不会落入else。甚至尝试将Tstpath = Test-Path \\$computer\c$作为变量并运行它。

当它解析第一个{Do Command}时,返回是

ls : Cannot find path '\\<computerName>\c$\u' because it does not exist.
At C:\Users\<username>\Scripts\FiToFin.ps1:19 char:3
+         ls -Path "\\$computer\c$\users" -Filter $Fltr -Recurse | Out-File -Append $On ...
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (\\<computername>\c$\u:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

工作原理:

如果我的测试机器开启,我可以ls -Path "\\$computer\c$\users" -Filter $Fltr -Recurse | Out-File -Append $Online就好了。

我从True得到FalseTest-Path \\$computer\c$,结果甚至可以> $varWrite-Host

我不知道为什么会这样,并且很想知道。

这也有效:

###################################################################
$computer = "TestPC"
$Tstpath = Test-Path \\$computer\c$
####################################################################
$Tstpath > $null
if($Tstpath -eq $True) {
    Write-Host "$computer is Online"
} else {
    Write-Host "$computer is NOT Online"
}

但是当你添加命令lsGet-ChildItem时,它会吓坏。 所以,问题是:为什么它永远不会执行else部分?

1 个答案:

答案 0 :(得分:3)

我看到两个可能导致问题的问题。如何初始化和更新变量$Tstpath

# Presumably Initialize
$Tstpath = test-path "\\$computer\c$"

# Updating in loop
test-path "\\$computer\c$" > $Tstpath

我将假设您在PowerShell ISE中进行测试,$Tstpath在某些时候具有$ true值。

问题是您从不更新变量。查看TechNet for about_redirection,您会看到:

   Operator  Description               Example  
   --------  ----------------------    ------------------------------
   '>'       Sends output to the       Get-Process > Process.txt
                specified file.

您的命令正在尝试将其输出到&#34; file&#34;。您应该遇到一个错误,即无法在系统中找到文件或文件,其中包含一个布尔值(因为它不是附加重定向器)。

你应该做些什么来保持你的逻辑是通过分配保存结果。

$Tstpath = Test-path "\\$computer\c$"

然后你可以测试一下。

然而,由于您再也不需要该值,因此它是多余的。将它更容易直接放在if语句中。

if(test-path "\\$computer\c$"){"Do something"}else{"Fail Trumpet"}

我还建议您使用Export-CSV -Append,因为您正在处理对象。可以获得良好的结构化输出。

Get-ChildItem -path "\\$computer\c$\users\" -Filter $Fltr -Recurse | Export-CSV -Append $Online -NoTypeInformation