Powershell - VirtualBox克隆脚本错误

时间:2015-02-04 19:56:45

标签: powershell virtualbox

代码:

[string]$vmPath = "C:\Users\someuser\VirtualBox VMs\"
[string]$vmName="Xubuntu_Version_"
[string]$vBoxManage = "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe"
[string]$vBoxClonevdi = "clonevdi"
[string]$vBoxVMName = Get-Content -Path "C:\Users\someuser\VirtualBox VMs\log.txt"
[string]$invokeCommand 
[string]$filetype=".vdi"
[string]$writeVersiontoText
[string]$vBoxManagewithQuotes= ([char]34 +$vBoxManage + [char]34 + " " +$vBoxClonevdi)

if(Test-Path ("C:\Users\someuser\VirtualBox VMs\log.txt")){

    [int]$ConvertNum = -1
    [int]::TryParse($vBoxVMName.Substring(16), [ref]$ConvertNum)

    Write-Output ("Version Number: " + $ConvertNum)
    $ConvertAfter = $ConvertNum + 1
    Write-Output ("New Version: " + $ConvertAfter)

    $writeVersiontoText = $vmPath+$vmName+$ConvertAfter+$filetype
    $write= ($vmName + $ConvertAfter) 

    $invokeCommand = ($vBoxManagewithQuotes + " " + [char]34+$vmPath+$vmName+$ConvertNum + [char] 34  + " " + [char]34+$writeVersiontoText+ [char]34) 
    Write-Output $invokeCommand


    Invoke-Expression $invokeCommand

   if(Test-Path ($writeVersiontoText)){
            $write | Set-Content "C:\Users\someuser\VirtualBox VMs\log.txt"
  }

 }

问题:

我正在编写一个使用Virtual Box Manage实用程序(VBoxManage.exe)来克隆虚拟机的脚本。我遇到的问题是它给我一个关于clonevdi部分的错误。究竟是什么问题,我该如何解决?

错误报告:

Invoke-Expression : At line:1 char:53
+ "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" clonevdi   "C:\Users\someuser\Virt ...
+                                                     ~~~~~~~~
Unexpected token 'clonevdi' in expression or statement.
At line:27 char:9
+         Invoke-Expression $invokeCommand
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : ParserError: (:) [Invoke-Expression],      ParseException
+ FullyQualifiedErrorId : UnexpectedToken,Microsoft.PowerShell.Commands.InvokeExpressionCommand

1 个答案:

答案 0 :(得分:1)

简短回答:

我认为你只需要改变这个:

Invoke-Expression $invokeCommand

到此:

& $vBoxManage $vBoxClonevdi ([char]34+$vmPath+$vmName+$ConvertNum + [char] 34  + " " + [char]34+$writeVersiontoText+ [char]34)

更长的答案:

我不会在代码中使用[char] 34,我会使用反引号(`)转义双引号并重构变量,以便它们更易于阅读。

然后,使用调用运算符(&)将允许调用可执行文件。这样的可执行文件需要有自己的变量,否则Powershell会查找以exec +提供的参数命名的可执行文件。需要在可执行变量之后添加其他参数,因此具有以下结构:

& $vBoxManage $vBoxManage other params here