2

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

我想用驱动器 G: 上每个“根文件夹”的子文件夹的名称创建 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" - 不能作为好...

非常感谢您的帮助!

-帕特里克

4

1 回答 1

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 或任何其他与管道相关的脚本块有效。所以下面的文件名结构T:\listing\fileListing+$_.Name+.txt不太正确。通常,您会像这样在字符串中扩展变量:

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

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

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

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

于 2010-10-17T16:30:40.850 回答