Use uma variável dentro de uma cadeia do powershell

3

Eu tenho isso atualmente em uma única linha no Powershell ISE

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

e no momento, esta linha não será executada. As variáveis são atribuídas a algo, então não há problema.

O que eu quero que aconteça é que o processo comece, mas com as variáveis preenchidas, por exemplo

Start-Process -filepath "C:\Powershell-Backup\disk2vhd.exe" -argumentlist 'C: \Computer1\ServerBackups$\MyComputer\Backup Operation 12/14/2014 1:55 PM.vhd  /accepteula'

O erro que recebo no log é

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

Como isso pode ser alcançado?

    
por EdG 14.12.2014 / 15:03

2 respostas

4

Primeiro, esse é um excelente lugar para usar um formatador de strings em vez de perder sua sanidade em relação a escape e interpolação. Em segundo lugar, em vez de Start-Process , você deve poder usar a instrução & :

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

ou se deve ser um oneliner

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

Um método que tende a ser mais uma prática recomendada, na minha opinião, que também oferece maneiras mais fáceis de solucionar problemas, é construir a string em uma variável e, em seguida, passar essa variável para o comando final. Dessa maneira, você pode verificar se a string está sendo construída corretamente antes de transmiti-la ao comando. Tentar obter o PowerShell para criar um caminho ou cadeia dinâmica dentro do parâmetro de um cmdlet nem sempre funciona como você acha que acontecerá sempre.

Então, eu faria algo assim:

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

Uma coisa a salientar é que o PowerShell trata as cadeias com variáveis incluídas de forma diferente com base no facto de estarem entre aspas simples ou aspas duplas. Se você colocar uma variável em uma cadeia de caracteres com aspas simples, o PowerShell a tratará como está, não resolverá essa variável para o que foi designado antes de criar a cadeia. Considerando que, se você usar aspas duplas, o PowerShell analisará a sequência dessas variáveis e as resolverá para o que é atribuído antes de finalizar a sequência. Você pode ver um bom exemplo disso no artigo da revista WindowsITPro: Single Quotes vs. Double Citações

    
por 15.12.2014 / 13:01

Tags