2013-08-09 10 views
8

Sono nuovo in Powershell e sto provando a scrivere uno script che controlla se esiste un file; se lo fa, controlla se un processo è in esecuzione. So che ci sono molti modi migliori per scrivere questo, ma qualcuno può darmi un'idea per favore? Ecco quello che ho:Script di Powershell per verificare se un file esiste nell'elenco di computer remoto

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}} 
    } 

La prima parte (controllare se il file esiste, funziona senza alcun problema, ma ho un'eccezione quando si controlla se il processo è in esecuzione:.

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 

Qualsiasi aiuto sarebbe apprezzato!

risposta

18

l'uguaglianza operatore di confronto è -eq, non eq. il valore booleano "vero" in PowerShell è $true. E se si desidera confrontare il risultato di Test-Path a qualcosa come si fa, è necessario eseguire il cmdlet in una sottoespressione, altrimenti -eq "True" verrà considerato come un'opzione aggiuntiva eq con l'argomento "True" nel cmdlet.

Modifica questo:

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

in questo:

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

o (meglio ancora), dal momento che Test-Path restituisce già un valore booleano, fare semplicemente questo:

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

Hi Ansgar , grazie molto!! Tuttavia non mostra per quale macchina il processo è in esecuzione. Il mio output è solo un elenco da cui le macchine hanno il file che sto cercando. Tuttavia, se il file è lì, ho bisogno di sapere anche se un processo è in esecuzione. C'è un modo per farlo? Ancora grazie per il tuo tempo. –

+0

'Select-Object' normalmente viene letto da una pipeline. Se lo si utilizza all'interno di un ciclo, è necessario alimentarlo tramite la proprietà '-InputObject':' Select-Object -InputObject $ _ @ {Name = ...} '. –

Problemi correlati