
Я нашел этот способ получить содержимое папки и ее подпапок (только файлы) в CSV-файле:
dir -recurse | Where-Object { !$_.PSIsContainer } | Select FullName |
convertto-csv | out-file "test.csv"
Однако вместо полного пути я хотел бы получить относительный путь (относительно корня, из которого я запускаю команду).
Кто-нибудь может помочь?
Спасибо!
решение1
Один из способов получить правильный CSV-файл — обернуть вывод из моего комментария:
Get-ChildItem -Recurse -Name -File |
ForEach-Object -begin {'"RelativePath"'}{'"{0}"' -f $_}|
Out-File "test.csv"
Или используйте вычисляемое свойство, чтобы удалить начальный каталог из FullName
свойства.
$StartDir = "$ENV:USERPROFILE\Documents\"
Get-ChildItem -Path $StartDir -File -Recurse |
Select-Object @{n='RelativePath';e={$_.FullName -replace [regex]::escape($StartDir)}}|
Export-Csv 'test.csv' -NoTypeInformation
решение2
Этот вопрос создает впечатление, что вы новичок в PowerShell. Поэтому крайне важно, чтобы вы освоились, чтобы ограничить/избежать заблуждений, плохих привычек, ошибок и серьезного разочарования, с которыми вы гарантированно столкнетесь. Зайдите на YouTube/MSDN Channel9 и найдите начальный, средний, продвинутый PowerShell, а также управление файловой системой PowerShell и управление файлами и папками PowerShell.
PowerShell во многих случаях будет пытаться принуждать вещи, но он не будет пытаться выяснить, что вы хотите сделать. Вы должны сказать ему, что делать. Ну, это верно для любого компьютерного языка.
Ваша проблема в том, что вы говорите...
(относительно корня, откуда я запускаю команду)
... ну, вы можете быть в пути, который находится на уровне X в глубине от корневого диска, так что теперь вы в дочернем, и экстраполяция заключается в том, что вы хотите этого только от дочернего. Вот в чем загвоздка с этим мыслительным процессом.
Сохраните это в текстовом файле, тогда у вас никогда не будет пути к диску, и, таким образом, когда вы вернетесь к нему, вам придется знать его и вручную ввести, чтобы снова использовать файлы.
Поэтому я не уверен, какой вариант вы используете для этих усилий, но, по логике вещей, это вам аукнется.
Итак, скажем, я здесь:
Push-Location -Path 'E:\Temp'
Затем мы запускаем это
Get-ChildItem -recurse |
Where-Object { !$_.PSIsContainer } | Select-Object -Property FullName
# Results
FullName
--------
E:\Temp\about_ReGet-ChildItemection Microsoft Docs.url
...
E:\Temp\ZipMultiFolder.zip
E:\Temp\Folder\Log_20190419.txt
...
E:\Temp\Reports\NewFiles.zip
...
Итак, здесь мы просто получаем текущее местоположение...
Get-ChildItem -recurse |
Where-Object { !$_.PSIsContainer } |
Select-Object -Property @{Name = 'RelativePath';Expression = {"\$($pwd.Drive.CurrentLocation)\$($PSItem.Name)"}}
Итак, здесь мы просто получаем текущий путь, по которому находимся, и запрашиваем только имя файла, а не полное имя.
# Results
RelativePath
------------
\Temp\about_ReGet-ChildItemection Microsoft Docs.url
...
\Temp\ZipMultiFolder.zip
\Temp\Folder\Log_20190419.txt
...
\Temp\Reports\NewFiles.zip
...
Если мы выведем это в CSV, вы понятия не имеете, с какого диска это пришло. Так что теперь вам придется искать на каждом диске на вашей машине, чтобы найти их, или вспомнить, где вы были, когда делали это.
Переход на дочерний элемент вниз, то же самое. Конечно, вы получаете это, но где это на самом деле? В вашей системе или на каком-то сетевом диске, к которому вы подключились.
Push-Location -Path 'E:\Temp\Folder'
Затем мы запускаем это
Get-ChildItem -recurse |
Where-Object { !$_.PSIsContainer } | Select-Object -Property FullName
# Results
FullName
--------
E:\Temp\Folder\Log_20190419.txt
E:\Temp\Folder\New Bitmap Image.bmp
E:\Temp\Folder\New Text Document - Copy.txt
E:\Temp\Folder\New Text Document.txt
Get-ChildItem -recurse |
Where-Object { !$_.PSIsContainer } |
Select-Object -Property @{Name = 'RelativePath';Expression = {"\$($pwd.Drive.CurrentLocation)\$($PSItem.Name)"}}
RelativePath
------------
\Temp\Folder\Log_20190419.txt
\Temp\Folder\New Bitmap Image.bmp
\Temp\Folder\New Text Document - Copy.txt
\Temp\Folder\New Text Document.txt
И если вы говорите, что вам не нужен родительский корень, то вы его отсекаете.
Однако это означает, что вы не только не знаете, с какого диска он был получен, но и не знаете, с какого корневого родительского диска он был получен.
Так что, просто скажи.
Кстати, лучше всего использовать в скриптах полное имя командлета. Сокращенные/псевдонимы хороши для интерактивных вещей. Конечно, мы все привыкли использовать 'dir', но сокращенная запись got Get-ChildItem — 'gci', что так же коротко, как did, но, вы знаете.
Get-Alias -Definition Get-ChildItem |
Format-Table -AutoSize
CommandType Name Version Source
----------- ---- ------- ------
Alias dir -> Get-ChildItem
Alias gci -> Get-ChildItem
Alias ls -> Get-ChildItem
Но эй, привычки действительно трудно сломать. ;-} --- --- и благоразумные решения — это те, которые работают на нас, независимо от того, что думают другие. ;-}
Ну, те, кто следуют за вами, занимают позицию. Так что быть хорошим гражданином PowerShell — это действительно хорошо.
Кстати, если вы собираетесь сделать это в скрипте, есть автоматическая переменная для такого рода вещей. Ну, получение места, где был запущен скрипт, и всего, что связано с этим местом.
См. эту статью.
Добавьте гибкости скрипту с помощью относительных путей к файлам