PowerShell:列在txt文件中的子目录

时间:2010-10-17 14:01:48

标签: powershell get-childitem

今天我开始在Windows PowerShell中编写脚本 - 所以请原谅我的“愚蠢”......

我想在驱动器G:上创建带有每个“rootfolder”子文件夹名称的txt-Files。在G:\我有以下文件夹:

1_data
2_IT_area
3_personal
4_apprenticeship
7_backup
8_archives
9_user_profile

所以我写了这个剧本:

get-childitem G:\ | ForEach-Object -process {gci $_.fullName -R} | WHERE {$_.PSIsContainer} > T:\listing\fileListing+$_.Name+.txt

但脚本没有按照我的意图行事 - 它只创建了一个文本文件..你可以帮我吗?我已按照此处所述尝试了>> http://www.powershellpro.com/powershell-tutorial-introduction/variables-arrays-hashes/“T:\ listing \ $ _.Name.txt” - 不起作用......

非常感谢你的帮助!

-Patrick

1 个答案:

答案 0 :(得分:3)

这应该做你想要的:

Get-ChildItem G:\ | Where {$_.PSIsContainer} | 
    Foreach {$filename = "T:\fileListing_$($_.Name).txt"; 
             Get-ChildItem $_ -Recurse > $filename} 

如果以交互方式输入(使用别名):

gci G:\ | ?{$_.PSIsContainer} | %{$fn = "T:\fileListing_$($_.Name).txt"; 
                                  gci $_ -r > $fn} 

$_特殊变量通常仅在脚本块{ ... }内对Foreach-Object,Where-Object或任何其他管道相关的scriptblock有效。因此,以下文件名构造T:\listing\fileListing+$_.Name+.txt并不完全正确。通常,您会在字符串中展开变量,如下所示:

$name = "John"
"His name is $name"

但是,当您访问像$_.Name这样的对象的成员时,您需要能够在字符串中执行表达式。您可以使用子表达式运算符$()来执行此操作,例如:

"T:\listing\fileListing_$($_.Name).txt"

除了文件名字符串构造之外,您不能在脚本块之外使用$_。所以你只需在Foreach scriptblock中移动文件名结构。然后创建该文件,并将相关目录的内容重定向到该文件名 - 这将创建该文件。