tools vmware powershell rvtools

Sharing RVTools Data Without Sharing Everything

A PowerShell tool that anonymises RVTools CSV exports so you can hand them to a vendor or third party without exposing your customer's environment.

7 April 2026
Sharing RVTools Data Without Sharing Everything

Note: This tool applies rules defined in a transform file to anonymise RVTools exports. It is the sole responsibility of the end user to review the output and verify it meets their requirements before sharing. No warranty is provided that all sensitive fields have been identified or correctly handled. When in doubt, have a security team review the output before it leaves your hands.


If you work in VMware environments, RVTools is probably already part of your workflow. It produces a detailed snapshot of a vSphere environment — VMs, hosts, clusters, datastores, networking — all exported as CSVs. Incredibly useful.

The problem comes when you need to share that data.

Whether it is a vendor doing a capacity review, a partner running an assessment, or a migration team doing planning work, the RVTools export contains a lot of information you probably should not be handing over directly. VM names that encode application and customer names, host names that follow internal naming conventions, IP addresses, MAC addresses, certificate thumbprints. All of it is in there.

The usual approach is to manually redact or rename things in Excel, which is error-prone, time-consuming, and not repeatable.

rv-normalise

I built rv-normalise to solve this. I tested it with the latest RVTools in my lab — 4.7.1.4.

It takes a RVTools CSV export, applies a set of rules defined in a transform file, and produces a clean anonymised version. VM names become vm1, vm2, vm3. Hosts become host1, host2. Clusters, datastores, networks — all consistently aliased. IP addresses and MAC addresses are blanked. Fields that have no business value for the recipient are dropped entirely.

The aliases are stable and consistent across every tab. If a VM is vm7 in tabvInfo, it is vm7 in tabvCPU, tabvDisk, and tabvMemory too. Cross-tab analysis still works — you just can not tie it back to a real name without the normalisation map.

No external dependencies

The anonymisation script — Invoke-RVNormalise.ps1 — uses only built-in PowerShell cmdlets. Transforms are JSON files parsed with ConvertFrom-Json, which ships with PowerShell 5.1 and later. Nothing is downloaded or installed at any point. This matters in practice: a lot of environments that handle sensitive customer data have restricted outbound access or locked-down PowerShell Gallery policies. The script works in all of them.

How it works

The script reads a transform JSON that defines the action for every column in every RVTools tab:

Before processing anything, it validates that every column in every CSV is accounted for in the transform. If RVTools has added or removed columns since the transform was written, the script stops and generates a review transform with the differences highlighted. You review, set the correct action for any new fields, and re-run. Nothing leaks by accident.

Output structure

Every run produces a timestamped output folder. Inside that:

output/<dataset>_<timestamp>/
  internal/               ← keep private
    original-dataset/     ← unmodified input CSVs
    transform/
      normalisation_map.json   ← maps real names to aliases
      standard.json            ← transform used for this run
  external/               ← safe to share
    <dataset>/
      NOTICE.txt
      dataset/            ← anonymised CSVs
      transformation/     ← copy of the transform (for recipient reference)

The internal/ folder stays with you. The normalisation_map.json is what would allow the anonymisation to be reversed, so it never leaves. The external/ folder is what you zip and send.

Runs are never overwritten. Each run gets its own timestamped folder, so you have a full audit trail of what was produced and when.

Transforms

The included standard transform covers RVTools 4.7.1.4. You can create your own by copying it and adjusting the field actions — useful if a specific recipient needs more or less data than the default, or if you want to skip certain tabs entirely.

When a new RVTools version adds columns the validation step will catch it, generate a review transform, and tell you exactly what changed before any data is processed.

Example run

PS /Users/peteha/GitHub/rv-normalise> ./Invoke-RVNormalise.ps1 -InputPath "./data/input/RVTools_export_all_2026-04-07_06.35.19"

RVTools Normaliser
==================
  Input:     /Users/peteha/GitHub/rv-normalise/data/input/RVTools_export_all_2026-04-07_06.35.19
  Output:    /Users/peteha/GitHub/rv-normalise/data/output/RVTools_export_all_2026-04-07_06.35.19_20260407_134746
  Transform: standard

Loading transform...
  Loaded: /Users/peteha/GitHub/rv-normalise/transforms/standard.json

Validating transform against CSV columns...
  All columns accounted for.

Building normalisation maps...
  switch: 1 unique values (prefix 'switch')
  datastore: 10 unique values (prefix 'ds')
  resource_pool: 7 unique values (prefix 'rp')
  host: 7 unique values (prefix 'host')
  cluster: 2 unique values (prefix 'cluster')
  network: 11 unique values (prefix 'net')
  vm: 26 unique values (prefix 'vm')
  datacenter: 1 unique values (prefix 'dc')
  vcenter: 1 unique values (prefix 'vcenter')
  dvswitch: 1 unique values (prefix 'dvs')
  folder: 0 unique values (prefix 'folder')

Processing CSV files...
  [OK]       RVTools_tabdvPort.csv
  [OK]       RVTools_tabdvSwitch.csv
  [OK]       RVTools_tabvCD.csv
  [OK]       RVTools_tabvCluster.csv
  [OK]       RVTools_tabvCPU.csv
  [OK]       RVTools_tabvDatastore.csv
  [OK]       RVTools_tabvDisk.csv
  [OK]       RVTools_tabvFileInfo.csv
  [OK]       RVTools_tabvHBA.csv
  [OK]       RVTools_tabvHealth.csv
  [OK]       RVTools_tabvHost.csv
  [OK]       RVTools_tabvInfo.csv
  [OK]       RVTools_tabvLicense.csv
  [OK]       RVTools_tabvMemory.csv
  [OK]       RVTools_tabvMultiPath.csv
  [OK]       RVTools_tabvNetwork.csv
  [OK]       RVTools_tabvNIC.csv
  [OK]       RVTools_tabvPartition.csv
  [OK]       RVTools_tabvPort.csv
  [OK]       RVTools_tabvRP.csv
  [OK]       RVTools_tabvSC_VMK.csv
  [OK]       RVTools_tabvSnapshot.csv
  [OK]       RVTools_tabvSource.csv
  [OK]       RVTools_tabvSwitch.csv
  [OK]       RVTools_tabvTools.csv
  [OK]       RVTools_tabvUSB.csv

Complete
  Processed : 26 files

  Run folder:        /Users/peteha/GitHub/rv-normalise/data/output/RVTools_export_all_2026-04-07_06.35.19_20260407_134746
  External (share):  /Users/peteha/GitHub/rv-normalise/data/output/RVTools_export_all_2026-04-07_06.35.19_20260407_134746/external/RVTools_export_all_2026-04-07_06.35.19
  Internal only:     /Users/peteha/GitHub/rv-normalise/data/output/RVTools_export_all_2026-04-07_06.35.19_20260407_134746/internal/original-dataset
                     /Users/peteha/GitHub/rv-normalise/data/output/RVTools_export_all_2026-04-07_06.35.19_20260407_134746/internal/transform/normalisation_map.json

  NOTICE
  ------
  It is the responsibility of the end user to review the output and
  verify that it meets their requirements before use or distribution.
  A NOTICE.txt has been written to the external package folder.

If the recipient needs an XLSX

The external package contains CSVs, which work directly with most tooling. If the recipient specifically needs an XLSX structured like a native RVTools export, there is a second convenience script — Convert-ToXlsx.ps1 — that takes the dataset folder and produces a workbook with one worksheet per tab in the standard RVTools tab order.

This script is for the recipient to run against the data they receive, not part of the anonymisation workflow. It requires the ImportExcel module and will attempt to install it from the PowerShell Gallery on first run, so it may not be appropriate for all environments.


Code is on GitHub: peteha/rv-normalise

P

link Referenced Links

arrow_back Back to Blog