PowerShell foreach功能

时间:2017-04-21 13:34:06

标签: function powershell variables foreach copy-item

我正在编写一个收集日志进行分析的函数。

我正在尝试使用变量来保持尽可能紧,但由于某种原因,该函数不会创建,关于括号和变量的呻吟声。

任何帮助都将不胜感激。

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

2 个答案:

答案 0 :(得分:0)

$Logs只是一个字符串,而不是字符串数组,因此您无法对其进行迭代。您可以使用以下方法解决此问题:

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

此外,您将CopyItem的结果分配给无效变量,并且不使用当前循环变量。你的功能可能应该是这样的:

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-$_"
    } 
}

注意:您可能应该将您的功能重命名为Copy-LogsToLocal或其他内容......

答案 1 :(得分:0)

该代码不起作用。

我认为你的意思是在$ LOGS中定义一个数组,但实际上你只定义了一个String。

试试这个:$LOGS = "CcmExec.log", "Scheduler.log", "WUAHandler.log"

此外,您似乎正在尝试将这3个文件复制到某处,但您正在做的是将var $文件设置为其他内容。语句$file In $LOGS表示变量$ file在循环的第一次是“CcmExec.log”,然后是“Scheduler.log”,依此类推。

所以我认为你想做的是:

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

我也删除了一些错别字。

那是对的吗?