VMware Cloud Community
benham
VMware Employee
VMware Employee
Jump to solution

how to list files in datastores?

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.

Reply
0 Kudos
1 Solution

Accepted Solutions
ykalchev
VMware Employee
VMware Employee
Jump to solution

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

Reply
0 Kudos
17 Replies
ykalchev
VMware Employee
VMware Employee
Jump to solution

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
Reply
0 Kudos
benham
VMware Employee
VMware Employee
Jump to solution

Yasen,

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

Reply
0 Kudos
ykalchev
VMware Employee
VMware Employee
Jump to solution

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
Reply
0 Kudos
benham
VMware Employee
VMware Employee
Jump to solution

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.

Reply
0 Kudos
ykalchev
VMware Employee
VMware Employee
Jump to solution

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
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.

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.

Reply
0 Kudos
benham
VMware Employee
VMware Employee
Jump to solution

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

Reply
0 Kudos
benham
VMware Employee
VMware Employee
Jump to solution

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!

Reply
0 Kudos
ykalchev
VMware Employee
VMware Employee
Jump to solution

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
Reply
0 Kudos
benham
VMware Employee
VMware Employee
Jump to solution

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

Reply
0 Kudos
MorDrakka
Contributor
Contributor
Jump to solution

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.

Reply
0 Kudos
LucD
Leadership
Leadership
Jump to solution

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

Reply
0 Kudos
admin
Immortal
Immortal
Jump to solution

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

Reply
0 Kudos
MorDrakka
Contributor
Contributor
Jump to solution

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.

Reply
0 Kudos
ferran_es
Contributor
Contributor
Jump to solution

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.

Reply
0 Kudos
KaldrZhu
Contributor
Contributor
Jump to solution

first connect your vCenter via Powercli, then run following code to enumerate datastore files. For me 79 datastores in 9 vcenters, it finished in half an hour and got totally 4K+ files. I think this speed is accetable.

$vmstores=dir vmstores:
$dcs=dir $vmstores.pspath
$vmfss=dir $dcs.pspath
$dsfiles=@()
$vmfss | %{$dsfiles+=dir $_.pspath -rec | ? itemtype -eq File}
$dsfiles

Reply
0 Kudos
Daksh2020
Contributor
Contributor
Jump to solution

The script is listing all the files in the folder. But how to list files in a subfolder.

Reply
0 Kudos