string - 从全名字符串知道路径是文件夹还是文件?

标签 string powershell

对不起,标题。我会尽力解释得更好。

假设我运行此命令以获取目录的所有路径,并且希望将其重定向到文本文件。

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/

相关文章:

java - 读取文本文件的最快方法

python - 通过在 Python 3.7 中按段落计算单词来自定义数据结构

powershell - 有没有办法用 Sonar 分析 powershell 脚本?

python - 从字符串中获取数字

php - 在 PHP 中生成字母数字字符串

jquery - 替换克隆的 jquery 对象中的字符串

Powershell - 通过 "Validation"函数属性引发异常

events - PowerShell中的.NET事件

powershell - 可以记录已扫描文件并在下次运行时忽略它们的Powershell脚本吗?

Powershell 函数处置或中止处理程序