The problem is here:

$MachineDirectory = $SubDirectoryInterim.split(' ')[1]

But as I don’t have any data to actually look at (that is, the format of 
$SubDirectoryInterim), I can’t tell you how to fix it – except that you’ll need 
to use something smarter than split().

From: listsad...@lists.myitforum.com [mailto:listsad...@lists.myitforum.com] On 
Behalf Of Kurt Buff
Sent: Wednesday, January 10, 2018 1:45 PM
To: powershell@lists.myitforum.com
Subject: [powershell] PowerShell, and spaces in directory names on a PS Drive 
for VMware

All,

Trying to copy vmware.log for all  the VMs in a cluster. This script works, as 
long as the directory name for the VMDK file doesn't have any spaces:

$VMList = get-vm -location LabCluster | sort name
ForEach ($VM in $VMList)
   {
   $Target = New-Item -ItemType Directory -Force -Path c:\temp\vm-logs\$VM
   $Store = Get-VM $VM | Get-DataStore
   $Disk = Get-VM $VM | Get-HardDisk
   $DirectoryRoot = $Disk.FileName.split('[]')[1]
   $SubDirectoryInterim = $Disk.FileName.split('/')[0]
   $MachineDirectory = $SubDirectoryInterim.split(' ')[1]
   New-PSDrive -Location $Store -Name ds -PSProvider VimDatastore -Root "\"
   Set-Location ds:\
   Set-Location $MachineDirectory
   Copy-DatastoreItem –Item vmware.log -Destination $Target
   Set-Location C:
   Remove-PSDrive -Name ds -Confirm:$false
   }
If the directory for the VMDKs has spaces in it (e.g., where the directory name 
is "New VM"), I get the following error:

Set-Location : Cannot find path 'ds:\New' because it does not exist.
At C:\BatchFiles\test-VMware.ps1:19 char:4
+    cd $MachineDirectory
+    ~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (ds:\New:String) [Set-Location], 
ItemNotFoundException
    + FullyQualifiedErrorId : 
PathNotFound,Microsoft.PowerShell.Commands.SetLocationCommand

Stepping through the lines of code above, it all works fine - but not in a 
script (and I'm not using ISE to execute).

Among other approaches, I've tried the following, and get a different error 
(and yes, I do see in the error output that there's only an initial double 
quote for '"ds' - but when I execute each of the lines manually there is a 
matching end double quote):

$VMList = get-vm -location LabCluster | sort name
ForEach ($VM in $VMList)
   {
   $Target = New-Item -ItemType Directory -Force -Path c:\temp\vm-logs\$VM
   $Store = Get-VM $VM | Get-DataStore
   $Disk = Get-VM $VM | Get-HardDisk
   $SubDirectoryInterim = $Disk.FileName.split('/')[0]
   $Directory = $SubDirectoryInterim.split(' ')[1]
   New-PSDrive -Location $Store -Name ds -PSProvider VimDatastore -Root "\"
   Set-Location ds:\
   $ChangeD = "$([char]34)ds:\$Directory$([char]34)"
# Neither of these work, even though the path (ds:\<pathname>) is surrounded by 
double quotes
   # Set-Location -LiteralPath $ChangeD
   Set-Location $ChangeD
   Copy-DatastoreItem –Item vmware.log -Destination $Target
   Set-Location C:
   Remove-PSDrive -Name ds -Confirm:$false
   }

Set-Location : Cannot find drive. A drive with the name '"ds' does not exist.
At C:\BatchFiles\get-vmwarelogs.ps1:20 char:4
+    Set-Location -LiteralPath $ChangeD
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: ("ds:String) [Set-Location], 
DriveNotFoundException
    + FullyQualifiedErrorId : 
DriveNotFound,Microsoft.PowerShell.Commands.SetLocationCommand



Reply via email to