代码:
[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
答案 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