Powershell - VirtualBox 克隆脚本错误
Powershell - VirtualBox Cloning Script Error
代码:
[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
简答:
我想你只需要改变这个:
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
代码:
[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
简答:
我想你只需要改变这个:
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