Verwenden Sie eine Variable in einer Powershell-Zeichenfolge

3

Ich habe dies derzeit in einer einzelnen Zeile in Powershell ISE

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

und im Moment wird diese Linie nicht laufen. Die Variablen sind etwas zugeordnet, also kein Problem dort.

Ich möchte, dass der Prozess startet, aber zum Beispiel mit den eingegebenen Variablen

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

Der Fehler, den ich im Protokoll erhalte, ist

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

Wie kann das erreicht werden?

EdG
quelle
ähm, C: \\ ist Tippfehler?
hjpotter92
Nein, als ich Nachforschungen anstellte, hieß es, es müsse so sein. C: das Laufwerk zu kopieren und \\ Computer1 ist , was ich kopieren möchte (über Netzwerk ...) Auch auf die Fehler zu ändern noch auftreten
EDG

Antworten:

4

Erstens ist dies ein ausgezeichneter Ort, um einen String-Formatierer zu verwenden, anstatt Ihre Vernunft durch Escape-Zeichen und Interpolation zu verlieren. Zweitens Start-Processsollten Sie in der Lage sein, die folgende &Anweisung zu verwenden:

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

oder wenn es ein oneliner sein muss

& C:\Powershell-Backup\disk2vhd.exe C: ('\\Computer1\ServerBackups$\{0}\{1}.vhd' -f $ComputerName, $JobTitle)
Eris
quelle
Der Einzeiler funktionierte am besten für mich. Vielen Dank!
EdG
4

Eine meiner Meinung nach eher bewährte Methode, die auch einfachere Möglichkeiten zur Problembehandlung bietet, besteht darin, die Zeichenfolge in einer Variablen zu erstellen und diese Variable dann an den endgültigen Befehl zu übergeben. Auf diese Weise können Sie überprüfen, ob die Zeichenfolge ordnungsgemäß erstellt wurde, bevor Sie sie an den Befehl übergeben. Der Versuch, PowerShell zum Erstellen eines dynamischen Pfads oder einer dynamischen Zeichenfolge innerhalb des Parameters eines Cmdlets zu bewegen, funktioniert nicht immer so, wie Sie es sich immer vorstellen.

Also würde ich so etwas machen:

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

Zu beachten ist, dass PowerShell Zeichenfolgen mit Variablen unterschiedlich behandelt, je nachdem, ob sie in einfache oder doppelte Anführungszeichen eingeschlossen sind. Wenn Sie eine Variable in eine Zeichenfolge mit einfachen Anführungszeichen einfügen, behandelt PowerShell sie so, wie sie ist, und löst diese Variable vor dem Erstellen der Zeichenfolge nicht in die zugewiesene Variable auf. Wenn Sie dagegen doppelte Anführungszeichen verwenden, analysiert PowerShell die Zeichenfolge für diese Variablen und löst sie in die zugewiesenen Werte auf, bevor die Zeichenfolge finalisiert wird. Ein gutes Beispiel dafür finden Sie im Artikel des WindowsITPro-Magazins: Einfache Anführungszeichen im Vergleich zu doppelten Anführungszeichen

Shawn Melton
quelle
Sie müssen das $ in doppelten Anführungszeichen für entkommen ServerBackups`$.
Matt
@matt nein ich nicht. Funktionierte gut auf meiner Maschine
Shawn Melton
Schätze, es ist kein Konflikt, da es von einem Backslash gefolgt wird
Matt