PowerShell foreach 函数内
PowerShell foreach within function
我正在编写一个函数来收集日志以供分析。
我正在尝试使用变量使其尽可能紧凑,但由于某些原因该函数无法创建,关于括号和变量的抱怨。
如有任何帮助,我们将不胜感激。
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}
}
你 $Logs
只是一个字符串,而不是一个字符串 array 因此你不能迭代它。您可以使用以下方法修复该问题:
$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
或其他名称...
该代码无效。
我认为您打算在 $LOGS 中定义一个数组,但实际上您只定义了一个字符串。
试试这个:$LOGS = "CcmExec.log", "Scheduler.log", "WUAHandler.log"
另外,您似乎正试图将这 3 个文件复制到某处,但您所做的是每次将 var $file 设置为其他内容。语句 $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
}
}
我还删除了一些拼写错误。
差不多吧?
我正在编写一个函数来收集日志以供分析。
我正在尝试使用变量使其尽可能紧凑,但由于某些原因该函数无法创建,关于括号和变量的抱怨。
如有任何帮助,我们将不胜感激。
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}
}
你 $Logs
只是一个字符串,而不是一个字符串 array 因此你不能迭代它。您可以使用以下方法修复该问题:
$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
或其他名称...
该代码无效。
我认为您打算在 $LOGS 中定义一个数组,但实际上您只定义了一个字符串。
试试这个:$LOGS = "CcmExec.log", "Scheduler.log", "WUAHandler.log"
另外,您似乎正试图将这 3 个文件复制到某处,但您所做的是每次将 var $file 设置为其他内容。语句 $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
}
}
我还删除了一些拼写错误。
差不多吧?