2011-04-21 69 views
1

對不起,標題。我會盡力解釋更好。如果路徑是文件夾或文件,從全名字符串中知道?

假設我運行此命令以獲取目錄的所有路徑,並且我想將它們重定向到文本文件。

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擴展名),因爲它包含名稱內的點。如果我不知道我的文件的所有可能的擴展名是否有任何屬性可以告訴我一個對象是否爲容器,以便我可以使用具有正確的開關文件或目錄的新項目來創建它?

我希望你已經理解我的問題,儘管我的英語。提前致謝。

編輯。 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 

一切工作正常。現在我可以實現我的目標。再次感謝。

LAST EDIT。 我有另一個想法。我決定在創建txt文件之前檢查一個對象是文件還是文件夾。經過一些困難(例如,我很快就發現,我不能重定向,我用隱藏表頭以出口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對象類型。

+2

停止嘗試存儲豐富的信息爲純文本,你不會有這個問題。 ;) – JasonMArcher 2011-04-22 00:13:26

回答

3

兩個FileInfo鍵入一個DirectoryInfo類型有一個屬性PSIsContainer,它允許您查看該對象是否是一個目錄。

PS C:\temp> (Get-Item 'Hello world.exe').PSIsContainer 
False 
PS C:\temp> (Get-Item 'c:\temp').PSIsContainer 
True 
2

我修改的代碼略有本:

gc c:\scripts\files.txt | % { 
$item = Get-item $_ 
Write-Host $item.fullName $item.PSIscontainer 
} 

現在,我的輸出是這樣的:

C:\Scripts\mytree\folder1 True 
C:\Scripts\mytree\folder2 True 
C:\Scripts\mytree\file1.txt False 
C:\Scripts\mytree\file2.txt False 
C:\Scripts\mytree\folder.with.dots True 
C:\Scripts\mytree\folder.with.dots\file inside folder with dots.txt False 
+0

+1。嗨ravikanth。非常感謝你。你的帖子總是很有趣。 :) – 2011-04-21 09:19:53

+0

NP。很高興你找到我的答案有幫助。 – ravikanth 2011-04-21 09:25:44

相關問題