Извините за название.Я попытаюсь объяснить лучше.
Предположим, что я запустил эту команду, чтобы получить все пути к каталогу, и я хочу перенаправить их в текстовый файл.
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 в соответствии с типом объекта.