我在使用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
得到False
或Test-Path \\$computer\c$
,结果甚至可以> $var
和Write-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"
}
但是当你添加命令ls
或Get-ChildItem
时,它会吓坏。
所以,问题是:为什么它永远不会执行else
部分?
答案 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