对不起,标题。我会尽力解释得更好。
假设我运行此命令以获取目录的所有路径,并且希望将其重定向到文本文件。
gci e:\mytree -r | % {$_.fullname} | out-file e:\folderstructure.txt
现在,我需要使用new-item cmdlet重新创建此嵌套结构。
现在假设我运行以下命令:
gc e:\folderstructure.txt | % {
[system.io.fileinfo]$info = $_
write-host $info $info.extension
}
产生以下输出:
E:\mytree\folder1
E:\mytree\folder2
E:\mytree\folder3
E:\mytree\file1.txt .txt
E:\mytree\file12.txt .txt
E:\mytree\folder1\folder.with.dots .dots
E:\mytree\folder1\folder.with.dots\file inside folder with dots.txt .txt
E:\mytree\folder3\file4.doc .doc
如您所见,folder.with.dots是一个文件夹,但是“被看到”为文件(它为我提供了.dots扩展名),因为它在名称中包含点。如果我不知道文件的所有可能扩展名,是否有任何属性可以告诉我对象是否为容器,以便可以将带有正确开关文件或目录的new-item用于创建它?
我希望你尽管我的英语也能理解我的问题。提前致谢。
编辑。 JPBlanc回答之后的更新
非常感谢你。 :)
我以这种方式尝试:
gc e:\folderstructure.txt | % {
[system.io.directoryinfo]$info = $_
if ($info.psiscontainer) {
write-host "$info is a folder" }
else {
write-host "$info is a file" }
}
输出为:
E:\mytree\folder1 is a file
E:\mytree\folder2 is a file
E:\mytree\folder3 is a file
E:\mytree\file1.txt is a file
E:\mytree\file12.txt is a file
E:\mytree\folder1\folder.with.dots is a file
E:\mytree\folder1\folder.with.dots\file inside folder with dots.txt is a file
E:\mytree\folder3\file4.doc is a file
遵循您的建议:
gc e:\folderstructure.txt | % {
[system.io.directoryinfo]$info = $_
if ((get-item $info).psiscontainer) {
write-host "$info is a folder" }
else {
write-host "$info is a file" }
}
E:\mytree\folder1 is a folder
E:\mytree\folder2 is a folder
E:\mytree\folder3 is a folder
E:\mytree\file1.txt is a file
E:\mytree\file12.txt is a file
E:\mytree\folder1\folder.with.dots is a folder
E:\mytree\folder1\folder.with.dots\file inside folder with dots.txt is a file
E:\mytree\folder3\file4.doc is a file
一切正常。现在我可以实现我的目标。再次感谢。
最后编辑。
我有另一个主意。我决定在创建txt文件之前检查对象是文件还是文件夹。经过一些困难(例如,我很快发现我无法将用于隐藏表头的format-table重定向到export-csv
http://blogs.msdn.com/b/powershell/archive/2007/03/07/why-can-t-i-pipe-format-table-to-export-csv-and-get-something-useful.aspx)
我想出了以下解决方案:
gci e:\mytree -r |
select fullname,@{n='folder';e={ switch ($_.psiscontainer) {
true {1}
false {0}
}
}
} | % {($_.fullname,$_.folder) -join ","} | out-file e:\structure.txt
那让我这个输出:
E:\mytree\folder1,1
E:\mytree\folder2,1
E:\mytree\folder3,1
E:\mytree\file1.txt,0
E:\mytree\file12.txt,0
E:\mytree\folder1\folder.with.dots,1
E:\mytree\folder1\folder.with.dots\file inside folder with dots.txt,0
E:\mytree\folder3\file4.doc,0
因此,我可以轻松拆分两个参数,并根据对象类型使用new-item cmdlet。
最佳答案
两种FileInfo
类型和DirectoryInfo
类型都有一个属性PSIsContainer
,它使您可以查看对象是否为目录。
PS C:\temp> (Get-Item 'Hello world.exe').PSIsContainer
False
PS C:\temp> (Get-Item 'c:\temp').PSIsContainer
True
关于string - 从全名字符串知道路径是文件夹还是文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5741477/