Powershell: 使用变量与Get-ChildItem命令

3
我正在编写一个脚本,用于迭代文件夹,获取文件夹名称的子字符串作为变量值,然后迭代每个文件夹中的日志文件,并从日志文件中获取一些数据以输出到 .csv 文件。 我遇到问题的地方是在使用已经设置的变量与 Get-ChildItem 时。当我仅运行这行代码时,它不提供任何值:
#running this to see the value of $files
$files = Get-ChildItem $_.FullName $folder

$files 没有任何值。

以下是整个脚本的部分,供参考和上下文:

#get all folders from the Logs directory    
$folders = Get-ChildItem "C:\Temp\MPOS\Logs"

#iterate through each folder
foreach ($folder in $folders) {

#set substrings of the folder name to variables
$storeNumber = $folder.Name.Substring(2,3)
$date = $folder.Name.Substring(9,7)
#get all files from the current folder being evaluated
$files = Get-ChildItem $_.FullName $folder

#iterate through each file in the current folder
foreach ($file in $files) {

    #set substring of the file name to a variable
    $registerNumber = $file.Name.Substring(12,4)
    #get content of the file
    $logfileContent = Get-Content $file
    #look for all matches of the string "TransactionNumber"
    $transactions = Select-String -InputObject $logfileContent -Pattern "TransactionNumber" -AllMatches
    #count number of matches from above
    $transactionCount = $transactions.Matches.Count

    #below info is creating the object for the .csv
    $transObject = New-Object PSObject

    $transObject | Add-Member -MemberType NoteProperty -Name "StoreNumber" -Value $storeNumber
    $transObject | Add-Member -MemberType NoteProperty -Name "Sales Date" -Value $date
    $transObject | Add-Member -MemberType NoteProperty -Name "RegisterNumber" -Value $registerNumber
    $transObject | Add-Member -MemberType NoteProperty -Name "Transactions" -Value $transactionCount

    $resultsArray += $transObject
    }
}

$resultsArray | Export-Csv C:\Temp\MPOS\MPOSTransactions.csv -NoTypeInformation

1
Get-ChildItem $_.FullName $folder 这段代码的作用是什么? - undefined
@4c74356b41 - 显然没有什么价值。我想要做的是将$files设置为$folder中的所有文件。这样说清楚了吗?类似于我如何将$folders设置为包含在"C:\Temp\MPOS\Logs"中的所有文件夹。我需要获取该目录中每个文件夹中的所有文件。希望这样说得清楚。然后,我想要遍历每个文件,并收集数据。我会在我的代码中添加一些注释来帮助理解。 - undefined
1
$_ 表示 "管道中的当前对象"。你正在使用的是 foreach 语句,而不是 ForEach-Object 循环,所以在你尝试使用 $_ 的上下文中它没有值。 - undefined
@Bill_Stewart - 谢谢,那么请问正确的方法是什么? - undefined
@Bill_Stewart - 搞定了,弄明白了。将它改成读取 $folder.FullName - 谢谢!!! - undefined
2个回答

1

以下是编辑后的代码 - 更改为读取 $folder.FullName - 现在工作正常!

$resultsArray = @()
$folders = Get-ChildItem "C:\Temp\MPOS\Logs"

foreach ($folder in $folders) {

$storeNumber = $folder.Name.Substring(2,3)
$date = $folder.Name.Substring(9,7)
$files = Get-ChildItem $folder.FullName

foreach ($file in $files) {

    $registerNumber = $file.Name.Substring(12,4)
    $logfileContent = Get-Content $file.FullName
    $transactions = Select-String -InputObject $logfileContent -Pattern "TransactionNumber" -AllMatches
    $transactionCount = $transactions.Matches.Count

    $transObject = New-Object PSObject

    $transObject | Add-Member -MemberType NoteProperty -Name "StoreNumber" -Value $storeNumber
    $transObject | Add-Member -MemberType NoteProperty -Name "Sales Date" -Value $date
    $transObject | Add-Member -MemberType NoteProperty -Name "RegisterNumber" -Value $registerNumber
    $transObject | Add-Member -MemberType NoteProperty -Name "Transactions" -Value $transactionCount

    $resultsArray += $transObject
    }
}

$resultsArray | Export-Csv C:\Temp\MPOS\MPOSTransactions.csv -NoTypeInformation

0

我曾经遇到过这个问题,但是后来发现我的情况是尝试通过管道加载一个同时使用Format-Table命令的值。

例如:(这个可以工作) $GetMostRecentFile = $GetLatestFile = Get-ChildItem -Force -Recurse -File -ErrorAction SilentlyContinue | Where-Object { $.LastWriteTime.Date -lt (Get-Date).Date -and $.Name -ne 'Thumbs.db' -and $_.Name -ne '.DS_Store'} | Sort LastWriteTime -Descending | Select-Object -First 1 LastWriteTime,FullName,Length

(这个不行) $GetLatestFile = Get-ChildItem -Force -Recurse -File -ErrorAction SilentlyContinue | Where-Object { $.LastWriteTime.Date -lt (Get-Date).Date -and $.Name -ne 'Thumbs.db' -and $_.Name -ne '.DS_Store'} | Sort LastWriteTime -Descending | Select-Object -First 1 LastWriteTime,FullName,Length | Format-Table -Wrap

因为我一直在使用 Format-Table 作为探索数据和构建查询命令的一部分,所以忘记了如果将其(用 FT)与变量一起传递,那么变量将不会有详细信息。

在我上面的情况中,我需要将 $GetMostRecentFile.FullName 和 $GetMostRecentFile.LastWriteTime 提取到另一个数组中。但是当我使用 FT 进行管道传递时,没有 $GetMostRecentFile.FullName。当我删除时


回答这个5年前的问题有点晚了,试着在https://codesandbox.io/上分享你的工作代码,这样新版本的答案可以帮助其他人。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接