2013-08-09 3 views
8

Jestem nowy w Powershell i próbuję napisać skrypt, który sprawdza, czy plik istnieje; jeśli tak, sprawdza, czy proces jest uruchomiony. Wiem, że jest o wiele lepsze sposoby na napisanie tego, ale czy ktoś może mi dać pomysł? Oto co mam:Skrypt powershell, aby sprawdzić, czy plik istnieje na liście komputerów zdalnych

Get-Content C:\temp\SvcHosts\MaquinasEstag.txt | ` 
    Select-Object @{Name='ComputerName';Expression={$_}},@{Name='SvcHosts Installed';Expression={ Test-Path "\\$_\c$\Windows\svchosts"}} 

    if(Test-Path "\\$_\c$\Windows\svchosts" eq "True") 
    { 
     Get-Content C:\temp\SvcHosts\MaquinasEstag.txt | ` 
     Select-Object @{Name='ComputerName';Expression={$_}},@{Name='SvcHosts Running';Expression={ Get-Process svchosts}} 
    } 

pierwsza część (sprawdzić, czy plik istnieje, działa bez problemu, ale mam wyjątek podczas sprawdzania, czy proces jest uruchomiony.

Test-Path : A positional parameter cannot be found that accepts argument 'eq'. 
At C:\temp\SvcHosts\TestPath Remote Computer.ps1:4 char:7 
+ if(Test-Path "\\$_\c$\Windows\svchosts" eq "True") 
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidArgument: (:) [Test-Path], ParameterBindingException 
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.TestPathCommand 

Każda pomoc będą mile widziane!

Odpowiedz

18

równość operator porównania jest -eq nie eq. zawiera wartość logiczną „prawda” w PowerShell jest $true. A jeśli chcesz porównać wynik Test-Path do czegoś, co robisz, musisz uruchomić cmdlet w podwyrażeniu, inaczej -eq "True" byłby traktowany jako dodatkowa opcja eq z argumentem "True" do cmdletu.

Zmień to:

if(Test-Path "\\$_\c$\Windows\svchosts" eq "True") 

w tym:

if (Test-Path "\\$_\c$\Windows\svchosts") 
+0

Hi Ansgar:

if ((Test-Path "\\$_\c$\Windows\svchosts") -eq $true) 

albo (jeszcze lepiej), ponieważ Test-Path już zwraca wartość logiczną, po prostu to zrobić , Wielkie dzięki!! Jednak to nie pokazuje, dla której maszyny proces jest uruchomiony. Moje wyniki to tylko lista, z której maszyny mają plik, którego szukam. Jednakże, jeśli plik tam jest, muszę wiedzieć również, czy proces jest uruchomiony. Czy jest jakiś sposób na zrobienie tego? Jeszcze raz dziękuję za poświęcony czas. –

+0

'Select-Object' zwykle czyta z potoku. Jeśli używasz go wewnątrz pętli, musisz go podać przez właściwość '-InputObject':' Select-Object -InputObject $ _ @ {Name = ...} '. –

Powiązane problemy