繁体   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