我目前在 Powershell ISE 中只有一行
Start-Process -filepath "C:\Powershell-Backup\disk2vhd.exe" -argumentlist 'C: \\Computer1\ServerBackups$\' + $ComputerName + '\' $JobTitle + '.vhd /accepteula'
目前,此行无法运行。变量已分配给某个变量,因此没有问题。
我希望发生的是启动该过程但填充变量,例如
Start-Process -filepath "C:\Powershell-Backup\disk2vhd.exe" -argumentlist 'C: \\Computer1\ServerBackups$\MyComputer\Backup Operation 12/14/2014 1:55 PM.vhd /accepteula'
我在日志中收到的错误是
Start-Process : A positional parameter cannot be found that accepts argument '+'.
At C:\Powershell-Backup\script.ps1:10 char:14
+ Start-Process <<<< -filepath "C:\Powershell-Backup\disk2vhd.exe" -argumentlist 'C: \\Computer1\ServerBackups$\' + $ComputerName '\' $JobTitle '.vhd /accepteula'
+ CategoryInfo : InvalidArgument: (:) [Start-Process], ParameterBindingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.StartProcessCommand
如何实现这一点?
答案1
首先,这是一个使用字符串格式化程序的绝佳场所,而不必为转义和插值而失去理智。其次,Start-Process
您应该能够使用以下&
语句:
$vhdPath = '\\Computer1\ServerBackups$\{0}\{1}.vhd' -f $ComputerName, $JobTitle
& C:\Powershell-Backup\disk2vhd.exe C: $vhdPath
或者如果它必须是一个单行
& C:\Powershell-Backup\disk2vhd.exe C: ('\\Computer1\ServerBackups$\{0}\{1}.vhd' -f $ComputerName, $JobTitle)
答案2
我认为,一种更符合最佳实践的方法,同时也提供了更简单的问题排查方法,即在变量中构建字符串,然后将该变量传递给最终命令。通过这种方式,您可以在将字符串传递给命令之前验证它是否正确构建。尝试让 PowerShell 在 cmdlet 的参数中构建动态路径或字符串并不总是像您想象的那样。
所以我会做这样的事情:
$argList = "C: \\Computer1\ServerBackups$\$ComputerName\$JobTitle.vhd /accepteula"
Start-Process -filepath "C:\Powershell-Backup\disk2vhd.exe" -argumentlist $argList
需要指出的一点是,PowerShell 对待包含变量的字符串的方式取决于它是用单引号还是双引号括起来。如果将变量放在用单引号括起来的字符串中,PowerShell 会按原样处理它,它不会在构建字符串之前将该变量解析为已分配的内容。而如果使用双引号,PowerShell 会解析字符串中的这些变量,并在最终确定字符串之前将它们解析为已分配的内容。您可以在 WindowsITPro Magazine 文章中看到一个很好的例子:单引号与双引号