如何像Get-Content中的每个输入行一样命名每个Out-File?

时间:2019-03-31 15:14:24

标签: powershell

我想从pathlist.txt中的每个路径获取内容,每个路径的内容都应保存到他自己的pathname.txt文件中,命名为输入路径。

是这样的:


$pathlist = Get-Content C:\Test\pathlist.txt

$pathlist | % { 
  Get-ChildItem $_ -Recurse |
    Out-File C:\Test\Output\"computername_" + $($_.replace("\","_").replace(":","")) +".txt" 
}

输入:

  • C:\ Test \ Test \ Test
  • D:\下载
  • C:\ Windows \ Temp

输出:

  • 计算机名C_Test_Test_Test.txt
  • computername_D_Download.txt
  • computername_C_Windows_Temp.txt

每个输出文本文件都包含Get-ChildItem -Recurse的命名路径结果。

2 个答案:

答案 0 :(得分:2)

$pathlist = Get-Content ‪C:\Test\pathlist.txt

$pathlist | ForEach-Object { 
  $outFile = 'C:\Test\Output\computername_{0}.txt' -f $_ -replace ':?\\', '_'
  Get-ChildItem -LiteralPath $_ -Recurse -Name > $outFile
}
  • 我已将多个.Replace()方法调用替换为对PowerShell's -replace operator的基于正则表达式的单个调用。

  • 我已经用一次调用PowerShell's format operator+替换了字符串连接(-f)。

  • 为简便起见,我已将Out-File替换为>

  • 我在-Name调用中添加了Get-ChildItem,以便输出相对于输入路径的路径字符串;如果需要绝对路径,请使用
    (Get-ChildItem -LiteralPath $_ -Recurse).FullName > $outFile代替(或
    Get-ChildItem -LiteralPath $_ -Recurse | Select-Object -ExpandProperty FullName > $outFile

关于您尝试过的事情

您的问题是您没有包装通过字符串连接在(...) 中构建目标文件名的表达式,如果您想将表达式用作命令 argument

请注意:

  • 在表达式中,字符串文字必须(用全引号)
  • 仅在需要包装 multiple 语句时才需要
  • $(...);否则,如果需要覆盖标准operator precedence,请使用(...)

因此,您的原始命令可以通过以下方式修复:

... | Out-File ('C:\Test\Output\computername_' + $_.replace("\","_").replace(":","") + '.txt')

答案 1 :(得分:0)

一切似乎都还可以,但存在拼写问题。试试这个:

$pathlist | ForEach { Get-ChildItem -path $_ -Recurse | Out-File "C:\Test\Output\computername_" + $($_.replace("\","_").replace(":","")) +".txt" }

让我知道。