今天我开始在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
答案 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中移动文件名结构。然后创建该文件,并将相关目录的内容重定向到该文件名 - 这将创建该文件。