benham
VMware Employee
VMware Employee

how to list files in datastores?

Jump to solution

Hi,

Would like to find out how to list all the files and size in datastore? The objective is to help generate a spreadsheet for storage planning.

Anyone has a sample script?

Could not seem to get it working with get-datastore.

0 Kudos
1 Solution

Accepted Solutions
ykalchev
VMware Employee
VMware Employee

Hi

You can use SearchDatastoreSubFolders of the HostDatastoreBrowser object to browse all files in the datastore

$ds = Get-Datastore <datastorename> | %{Get-View $_.Id}

$fileQueryFlags = New-Object VMware.Vim.FileQueryFlags

$fileQueryFlags.FileSize = $true

$fileQueryFlags.FileType = $true

$fileQueryFlags.Modification = $true

$searchSpec = New-Object VMware.Vim.HostDatastoreBrowserSearchSpec

$searchSpec.details = $fileQueryFlags

$searchSpec.sortFoldersFirst = $true

$dsBrowser = Get-View $ds.browser

$rootPath = "[]" -f ($ds.summary.Name)

$searchResult = $dsBrowser.SearchDatastoreSubFolders($rootPath, $searchSpec)

foreach ($folder in $searchResult) {

foreach ($fileResult in $folder.File) {

$file = "" | select Name, Size, Modified, FullPath

$file.Name = $fileResult.Path

$file.Size = $fileResult.Filesize

$file.Modified = $fileResult.Modification

$file.FullPath = $folder.FolderPath + $file.Name

$file | out-default

}

}

You can also check query property of the SearchSpec object in order to filter files by type(i.e. only VmDisk or Vmconfig files)Regards,

Yasen

Yasen Kalchev, vSM Dev Team

View solution in original post

0 Kudos
15 Replies
ykalchev
VMware Employee
VMware Employee

Hi

You can use SearchDatastoreSubFolders of the HostDatastoreBrowser object to browse all files in the datastore

$ds = Get-Datastore <datastorename> | %{Get-View $_.Id}

$fileQueryFlags = New-Object VMware.Vim.FileQueryFlags

$fileQueryFlags.FileSize = $true

$fileQueryFlags.FileType = $true

$fileQueryFlags.Modification = $true

$searchSpec = New-Object VMware.Vim.HostDatastoreBrowserSearchSpec

$searchSpec.details = $fileQueryFlags

$searchSpec.sortFoldersFirst = $true

$dsBrowser = Get-View $ds.browser

$rootPath = "[]" -f ($ds.summary.Name)

$searchResult = $dsBrowser.SearchDatastoreSubFolders($rootPath, $searchSpec)

foreach ($folder in $searchResult) {

foreach ($fileResult in $folder.File) {

$file = "" | select Name, Size, Modified, FullPath

$file.Name = $fileResult.Path

$file.Size = $fileResult.Filesize

$file.Modified = $fileResult.Modification

$file.FullPath = $folder.FolderPath + $file.Name

$file | out-default

}

}

You can also check query property of the SearchSpec object in order to filter files by type(i.e. only VmDisk or Vmconfig files)Regards,

Yasen

Yasen Kalchev, vSM Dev Team

View solution in original post

0 Kudos
benham
VMware Employee
VMware Employee

Yasen,

Is that perl or Powershell script? I would like to do with the Powershell VI Toolkit if possible.

0 Kudos
ykalchev
VMware Employee
VMware Employee

It seems the code didn't show correct on IE. I've update the script code and I hope it's looking good now.

Yes It's VI Toolkit for Windows script

Yasen Kalchev, vSM Dev Team
0 Kudos
benham
VMware Employee
VMware Employee

Yasen,

Perfect, it works fine except the output is on to screen with repeated header lines.

How can it be modified to write to a CSV file? I tried the export-CSV, it seems that there is only 1 line of output.

0 Kudos
ykalchev
VMware Employee
VMware Employee

I've just collect all files into a hashtable and then pipe then to export-cvs

$fileList = @{}

foreach ($folder in $searchResult) {

foreach ($fileResult in $folder.File) {

$file = "" | select Name, Size, Modified, FullPath

$file.Name = $fileResult.Path

$file.Size = $fileResult.Filesize

$file.Modified = $fileResult.Modification

$file.FullPath = $folder.FolderPath + $file.Name

fileList.Add($file.FullPath, $file)

}

}

$fileList.Values | select Name, Size, Modified, FullPath | export-csv "datastore.csv"

Regards,

Yasen

Yasen Kalchev, vSM Dev Team
admin
Immortal
Immortal

Hi,

Would like to find out how to list all the files and size in datastore? The objective is to help generate a spreadsheet for storage planning.

Anyone has a sample script?

Could not seem to get it working with get-datastore.

Another alternative if you're feeling a bit adventurous would be to use the community extensions. There is a cmdlet within the extension called get-datastorefiles.

Basically the full script you would use is:

(new-object net.webclient).DownloadString("http://communities.vmware.com/servlet/JiveServlet/downloadBody/6051-102-1-3481/Extensions.psm1") > $env:temp/Extensions.psm1
add-module $env:temp/Extensions.psm1
get-datastorefiles (get-datastore ds1,ds2,ds3)

This will return an array of objects that you can use on the pipeline, etc. Note: This requires the latest PowerShell 2 CTP.

0 Kudos
benham
VMware Employee
VMware Employee

Perfect, that's what I need. Appreciate it very much. Cheers!

0 Kudos
benham
VMware Employee
VMware Employee

How can I loop it, so that I can capture multiple selected datastore? e.g. of certain naming convention type?

Pardon me, I am very new to PowerShell, still trying to learn the basics.

Cheers!

0 Kudos
ykalchev
VMware Employee
VMware Employee

You can just add the code for one datastore in a loop for each datastore you get:

Get-Datastore <filter> | % {

$ds = Get-View $_.Id

process datastore files here

}

So the script will look smth like this:

Get-Datastore <search criteria> | % {

$ds = Get-View $_.Id

$fileQueryFlags = New-Object VMware.Vim.FileQueryFlags

$fileQueryFlags.FileSize = $true

$fileQueryFlags.FileType = $true

$fileQueryFlags.Modification = $true

$searchSpec = New-Object VMware.Vim.HostDatastoreBrowserSearchSpec

$searchSpec.details = $fileQueryFlags

$searchSpec.sortFoldersFirst = $true

$rootPath = "[{0}]" -f ($ds.summary.Name)

$dsBrowser = Get-View $ds.browser

$searchResult = $dsBrowser.SearchDatastoreSubFolders($rootPath, $searchSpec)

$fileList = @{}

foreach ($folder in $searchResult) {

foreach ($fileResult in $folder.File) {

$file = "" | select Name, Size, Modified, FullPath

$file.Name = $fileResult.Path

$file.Size = $fileResult.Filesize

$file.Modified = $fileResult.Modification

$file.FullPath = $folder.FolderPath + $file.Name

$fileList.Add($file.FullPath, $file)

}

}

}

$fileList.Values | select Name, Size, Modified, FullPath | export-csv "datastore.csv"

Regards,

Yasen

Yasen Kalchev, vSM Dev Team
0 Kudos
benham
VMware Employee
VMware Employee

For some reason, some datastore takes a very very long time to generate. Any particular reason?

0 Kudos
MorDrakka
Contributor
Contributor

I am trying to create a script that will list all vmdk's on all datastores. This script given here is my starting point. However I cannot make this work.

$ds = Get-Datastore | %{Get-View $_.Id}

Script errors on this. Each time I run this script I get an error like

A parameter cannot be found that matches parameter name 'Datastore-datastore-20029'

At line 18, position 110

$ds = Get-Datastore | %{Get-View $_.Id}

So I am thinking the problem is $_.id is "Datastore-datastore-20029" and Get-view does not recognize this. When I removed $_.I, i received a popup to enter a MoRef.

Anyonhe cahelp me with this? I just need a script that lists all files on a datastore.

0 Kudos
LucD
Leadership
Leadership

I suspect you are using VI Toolkit v1 (use Get-VIToolkitversion to check, it should return build 103777).

If yes, the Get-View cmdlet has changed.

Do a Get-Help Get-View to see the new syntax.

PS: try to open a new thread for a new question, it makes it easier for other community members to follow


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

0 Kudos
admin
Immortal
Immortal

Hi all,

In VI Toolkit v1.0 there is a datastore provider. This may be very interesting feature to use in some cases. Here is how you can use it:

First you need to mount the datastore provider to some drive:

PS C:\&gt; Get-Datastore -Name "storage1 (3)"| New-DatastoreDrive -Name "ds"

Name Provider Root CurrentLocation

-


-


-


-


ds VimDatastore \Datastore\443@10.23.113.41\Data...

Now you can 'cd' to it and do all directory operations you like:

PS C:\&gt; cd ds:

PS ds:\&gt; dir

Datastore path:

LastWriteTime Type Length Name

-


-


-


-


2/25/2008 6:11 PM Folder Win2003 64bit

2/24/2008 8:19 AM Folder Win2003 32bit

2/24/2008 12:07 AM Folder WinXP 32bit

6/16/2008 2:27 PM Folder RedHat 9

2/24/2008 11:10 PM Folder WinXP 64bit

6/20/2008 11:57 AM Folder PS20_win2003

8/6/2008 11:15 AM Folder testMachine_Vista_32bit

8/5/2008 5:07 PM Folder testMachine_2003_64bit

8/6/2008 11:25 AM Folder testMachine_XP_64bit

6/6/2008 2:22 PM Folder Ubuntu

6/24/2008 2:29 PM Folder WinVista Business 64b...

8/6/2008 11:00 AM Folder VC4.0

0 Kudos
MorDrakka
Contributor
Contributor

Thanks for reply,

I used this thread because I thought code was the problem.

It is weird though, this morning I installed "VMware-Vim4PS-1.0.0-103777.exe, however Get-ViToolkitversion is not recognised as a cmdlet. I guess I reïnstall everything. Thanks.

0 Kudos
ferran_es
Contributor
Contributor

Great script. Thanks for the time taken to put it together.

Just one small correction:

As it is, it will only export to CSV the contents of the last Datastore, because on each new call of the block a new blank $fileList is created.

To report all of the datastores, you must move the line "$fileList = @{}" out of the loop, for instance before the "Get-Datastore" command.

Thanks.

Ferran.

0 Kudos