Знаете ли из строки полного имени, если путь это папка или файл? - PullRequest
1 голос
/ 21 апреля 2011

Извините за название.Я попытаюсь объяснить лучше.

Предположим, что я запустил эту команду, чтобы получить все пути к каталогу, и я хочу перенаправить их в текстовый файл.

gci e:\mytree -r | % {$_.fullname} | out-file e:\folderstructure.txt

Теперь мне нужно воссоздать эту вложенную структуру с помощью командлета new-item.

Давайте теперь предположим, что я запускаю эту команду:

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

все отлично работает.Теперь я могу достичь своей цели.Еще раз спасибо.

ПОСЛЕДНИЕ РЕДАКТИРОВАТЬ. У меня была другая идея.Я решил проверить, является ли объект файлом или папкой, прежде чем создавать текстовый файл.После некоторых трудностей (например, я скоро обнаружил, что не могу перенаправить формат-таблицу, которую использовал, чтобы скрыть заголовки таблицы в 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 в соответствии с типом объекта.

Ответы [ 2 ]

3 голосов
/ 21 апреля 2011

Оба типа FileInfo типа DirectoryInfo имеют свойство PSIsContainer, которое позволяет увидеть, является ли объект каталогом или нет.

PS C:\temp> (Get-Item 'Hello world.exe').PSIsContainer
False
PS C:\temp> (Get-Item 'c:\temp').PSIsContainer
True
2 голосов
/ 21 апреля 2011

Я немного изменил ваш код так:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...