2017-04-21 5 views
0

Ich schreibe eine Funktion, um Protokolle für die Analyse zu sammeln.PowerShell foreach innerhalb der Funktion

Ich versuche, Variablen zu verwenden, um es so eng wie möglich zu halten, aber aus irgendeinem Grund wird die Funktion nicht erstellen, stöhnt über Klammern und Variablen.

Jede Hilfe wäre willkommen.

FUNCTION GetLogs ($CompName) 
{ 
$LOGS = "CcmExec.log,Scheduler.log,WUAHandler.log" 
$CCMPath = "C$\Windows\CCM\Logs" 
$Target = "C:\Temp\Logs" 

foreach (file$ IN $LOGS) {file$ = Copy-Item \\$CompName\$CCMPath\$LOGS $Target\$CompName-$LOGS}  
} 
+0

$ Datei anstelle der Datei $ –

Antwort

0

Dieser Code wird nicht funktionieren.

Ich denke, Sie wollten ein Array in $ LOGS definieren, aber Sie definieren tatsächlich nur einen String.

Try this: $LOGS = "CcmExec.log", "Scheduler.log", "WUAHandler.log"

Auch sieht es aus wie Sie irgendwo jene drei Dateien zu kopieren versuchen, aber was Sie tun, ist die var $ file auf etwas anderes jeder Runde setzen. Die Anweisung $file In $LOGS bedeutet, dass die Variable $ file beim ersten Mal der Schleife "CcmExec.log" ist, dann "Scheduler.log" und so weiter.

Also, was ich denke, was Sie tun wollen, ist dies:

Function GetLogs ($CompName) { 

$LOGS = "CcmExec.log","Scheduler.log","WUAHandler.log" 
$CCMPath = "C$\Windows\CCM\Logs" 
$Target = "C:\Temp\Logs" 

foreach ($file In $LOGS) { 
     Copy-Item -Path \\$CompName\$CCMPath\$file -Destination $Target\$CompName-$file 
    }  
} 

ich auch einige Fehler beseitigt.

Ist das ungefähr richtig?

+0

Ja, ich kannte Arrays, aber nicht annähernd genug, um zu wissen, was ich nicht wusste! – RJC

+0

Nr. Akzeptiere meine Antwort, es ist schöner als Martin Brandls;) Nur Spaß, beide arbeiten, wählen Sie die, die Sie mögen. – 30000MONKEYS

+0

Ich habe keine Stellung und kann diese schönen Antworten nicht hochschieben! Es ist eine großartige Antwort und wenn ich Powershell in einem Monat Mittagessen lese, werde ich mich mit diesen Konzepten beschäftigen. – RJC

0

Sie $Logs ist nur eine Zeichenfolge, kein String Array daher kann man nicht über sie iterieren. Sie können beheben, dass die Verwendung:

$LOGS = "CcmExec.log", "Scheduler.log","WUAHandler.log" 

Auch das Ergebnis des CopyItem auf eine ungültige Variable zuweisen und nicht den aktuellen Schleifenvariable verwenden. Ihre Funktion wahrscheinlich sollte wie folgt aussehen:

function Get-Logs 
{ 
    Param 
    (
     [string]$CompName 
    ) 

    $logs = "CcmExec.log", "Scheduler.log","WUAHandler.log" 
    $ccmPath = "C$\Windows\CCM\Logs" 
    $target = "C:\Temp\Logs" 

    $logs | ForEach-Object { 
     Copy-Item -Path "\\$CompName\$ccmPath\$_" -Destination "$target\$CompName-$_" 
    } 
} 

Hinweis: Sie sollten wahrscheinlich benennen Sie Ihre Funktion Copy-LogsToLocal oder etwas ...

+0

Danke Martin, ich wusste, dass ich etwas falsch gemacht habe und deine Erklärung und der korrigierte Code funktionieren wunderbar. – RJC

+0

Gern geschehen. Bitte überlegen Sie, die Antwort zu akzeptieren. –

Verwandte Themen