3

Я получил это в настоящее время на одной строке в 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

Как этого достичь?

2 ответа2

4

Метод, который, по моему мнению, является лучшей практикой, который также предлагает более простые способы устранения проблем, состоит в том, чтобы создать строку в переменной и затем передать эту переменную в вашу последнюю команду. Таким образом, вы можете проверить правильность построения строки перед ее передачей команде. Попытка заставить PowerShell создать динамический путь или строку в параметре командлета не всегда работает так, как вы думаете, каждый раз.

Так что я бы сделал что-то вроде этого:

$argList = "C: \\Computer1\ServerBackups$\$ComputerName\$JobTitle.vhd /accepteula"
Start-Process -filepath "C:\Powershell-Backup\disk2vhd.exe" -argumentlist $argList

Следует отметить, что PowerShell обрабатывает строки с включенными переменными по-разному в зависимости от того, заключены ли они в одинарные или двойные кавычки. Если вы поместите переменную в строку с одинарными кавычками, PowerShell будет обрабатывать ее как есть, она не будет преобразовывать эту переменную в значение, назначенное до построения строки. Принимая во внимание, что если вы используете двойные кавычки, PowerShell проанализирует строку для этих переменных и разрешит их до того, что назначено, до финализации строки. Вы можете увидеть хороший пример этого в статье журнала WindowsITPro: одинарные кавычки против двойных кавычек

4

Во-первых, это отличное место для использования форматирования строк вместо потери здравого смысла из-за экранирования и интерполяции. Во-вторых, вместо Start-Process вы должны использовать оператор & :

$vhdPath = '\\Computer1\ServerBackups$\{0}\{1}.vhd' -f $ComputerName, $JobTitle
& C:\Powershell-Backup\disk2vhd.exe C: $vhdPath

или если это должен быть oneliner

& C:\Powershell-Backup\disk2vhd.exe C: ('\\Computer1\ServerBackups$\{0}\{1}.vhd' -f $ComputerName, $JobTitle)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .