簡體   English   中英

將文件名傳遞給 Powershell 中的變量?

[英]Passing filename to variable in Powershell?

我在工作目錄中有數百個文件需要處理。 它看起來與此相似

a.txt
b.txt
c.txt
d.txt

所有這些文件都可以像這樣手動處理

$lines = Get-Content "a.txt"
foreach ($line in $lines){
  Out-File -FilePath "a-done.txt" -Encoding UTF8 -Append -InputObject ($line.Split(","))[0]
}

如何通過將所有文件名傳遞給上面的變量來使用循環自動化這個過程。

我已經嘗試過 foreach 循環,但它不起作用

$lines = Get-Content "path/*.txt"
foreach ($line in $lines){
  Out-File -FilePath "$lines-processed.txt" -Encoding UTF8 -Append -InputObject ($line.Split(","))[0]
}

我在這里想念什么?

您正在遍歷獲取內容的行,而不是保存文件名的位置。 你可能需要一個額外的步驟,例如

$items = Get-ChildItem 'C:\Users\Alex\Desktop\oop'
foreach ($item in $items) {
<#your processin with get-content here#>
echo $item.name
echo "$item-processed.txt"

}


我第一次理解錯了。 我希望我現在是:

您希望done-File文件。

您的代碼的問題是您正在收集$lines-Variable所有文件的所有內容。 並且不再有關於底層File(-names)的信息。 相反,您必須遍歷所有文件並單獨處理它們。

解決方案建議:

$files = dir *.txt -Exclude *done.txt 
foreach ($f in $files) {
  Get-Content $f | % {$_.split(',')[0]} | 
    Out-File ($f.DirectoryName + '\' + $f.Basename + '-done.txt') -Encoding UTF8}

問候馬丁

要自己發現文件,您需要使用Get-ChildItem而不是Get-Content 要引用不帶擴展名的文件名(即a.txt中的a ),請引用BaseName屬性:

foreach($file in Get-ChildItem .\path\ -Filter *.txt){
  foreach ($line in $file |Get-Content){
    Out-File -FilePath "$($file.BaseName)-done.txt" -Encoding UTF8 -Append -InputObject ($line.Split(","))[0]
  }
}

這是我如何將 csv 文件組合成一個大 CSV 的示例。

$txtFilter  = "D:\Temp\*.csv"
$fileOutputSummary = "D:\Temp\Summary.csv"
$list = Get-ChildItem -Path $txtFilter | select FullName
$iItems = $list.Count
$i = 0
ForEach($file in $list){
    $i++
    Write-Host "Combining  ($i of $iItems) `r"
    Write-Progress -Activity "Combining CSV files" -PercentComplete ($i / $iItems*100) 
    Import-Csv -Path $file.FullName | Export-Csv -Path $fileOutputSummary -Append -NoTypeInformation 
    Sleep 1
} # end ForEach file

我希望我的例子有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM