为何returnFile函数跳过首行后仍返回完整字符串?
returnFile Function's -skip Parameter Issue It sounds like your returnFile function isn't correctly skipping the first line when you specify -skip 1. Let's walk through the most common causes and fixes for this problem.
1. The -skip Parameter Isn't Being Used in the Function Body
The most likely issue is that your function defines the -skip parameter but doesn't actually pass it to the file-reading cmdlet. For example, if your function looks like this:
function returnFile { param( [string]$path, [int]$skip = 0 ) # ❌ -skip parameter is defined but not used here Get-Content -Path $path }
To fix this, you need to pass the -skip value to Get-Content using its -Skip parameter:
function returnFile { param( [Parameter(Mandatory=$true)] [string]$path, [int]$skip = 0 ) # ✅ Use the -Skip parameter to skip the specified number of lines Get-Content -Path $path -Skip $skip }
2. Using -Raw with Get-Content Breaks Line Skipping
If your function uses Get-Content -Raw, this reads the entire file into a single string. Since -Skip operates on individual lines, this parameter will be ignored because there's only one "line" (the entire file). For example:
function returnFile { param( [string]$path, [int]$skip = 0 ) # ❌ -Skip is ineffective when using -Raw Get-Content -Path $path -Raw -Skip $skip }
If you need the output as a single string (without the first line), read the lines first, skip the desired number, then join them back together:
function returnFile { param( [Parameter(Mandatory=$true)] [string]$path, [int]$skip = 0 ) # Read lines, skip the first N, then join into a single string $lines = Get-Content -Path $path -Skip $skip $lines -join "`n" # Use "`r`n" for Windows-style line endings }
3. Verify Parameter Binding and Input Paths
Double-check that:
- The
$CSVs[$i]variable contains a valid, accessible file path (debug withWrite-Host $CSVs[$i]to confirm). - The function's
-skipparameter is correctly defined (no typos, and it's of type[int]). - PowerShell is correctly passing the
-skip 1value to the function (add a debug line inside the function likeWrite-Host "Skipping $skip lines"to verify).
Bonus: Merging CSV Files Efficiently
Since your end goal is to merge CSV files with identical headers, here's a streamlined approach that avoids manual line skipping:
# Get the header from the first file $header = Get-Content -Path $CSVs[0] -TotalCount 1 # Combine all files, skipping headers except the first $mergedData = $header + ($CSVs | ForEach-Object { Get-Content -Path $_ -Skip 1 }) # Save to a new CSV $mergedData | Out-File -Path "merged.csv" -Encoding UTF8
This approach ensures you only keep one header row and append all data rows from subsequent files.
内容的提问来源于stack exchange,提问作者Tyler Montney

