Daher wollte ich diese Datei einfach in die Programme kopieren, wo sie folgendermaßen aussehen muss (muss mit der rechten Maustaste geklickt werden, als Administrator ausführen):
Copy-Item \\Poplar\SuperSound -Destination 'C:\Program Files\' -Force -Recurse
aber ich brauchte es in einem Powershell-Skript.
Normalerweise erhöhe ich die Anzahl der Punkte folgendermaßen:
powershell -command "install_bananas.bat" -Verb runas
aber wenn ich laufe:
powershell -command "Copy-Item \\Zuul\IT\ffmpeg -Destination 'C:\Program Files\' -Force -Recurse" -Verb runas
...das einen Fehler ausspuckte:
Copy-Item : A positional parameter cannot be found that accepts argument 'runas'.
Also muss ich stattdessen -argumentlist mit Start-Process verwenden:
Start-Process powershell -Verb runas -argumentlist "Copy-Item \\Poplar\SuperSound -Destination 'C:\Program Files\' -Force -Recurse"
Ich vermute also, dass die Argumentliste nur vom Startprozess verwendet wird.
Also was istPowershell-BefehlgegenStart-Prozess Powershell -Argumentlisteund warum gibt es dann Probleme mit -Verb runas, wenn ein Befehl mit mehreren Argumenten wie diesem ausgeführt werden muss:
Copy-Item A -Destination B
?
HINWEIS: Ich denke, es ist endlich Zeit, ein Powershell-Buch zu kaufen.
Antwort1
Obwohl ein Buch dir Dinge bringt,Greifen Sie zuerst auf die Hilfedateien zuda sie kostenlos und direkt vor Ihnen sind. ;-}
# Get specifics for a module, cmdlet, or function
(Get-Command -Name Start-Process).Parameters
(Get-Command -Name Start-Process).Parameters.Keys
# Results
<#
FilePath
ArgumentList
Credential
WorkingDirectory
LoadUserProfile
NoNewWindow
PassThru
RedirectStandardError
RedirectStandardInput
RedirectStandardOutput
Verb
WindowStyle
Wait
UseNewEnvironment
Verbose
Debug
ErrorAction
WarningAction
InformationAction
ErrorVariable
WarningVariable
InformationVariable
OutVariable
OutBuffer
PipelineVariable
#>
Get-help -Name Start-Process -Examples
# Results
<#
Start-Process -FilePath "sort.exe"
Start-Process -FilePath "myfile.txt" -WorkingDirectory "C:\PS-Test" -Verb Print
Start-Process -FilePath "Sort.exe" -RedirectStandardInput "Testsort.txt" -RedirectStandardOutput "Sorted.txt" -RedirectStandardError
Start-Process -FilePath "notepad" -Wait -WindowStyle Maximized
Start-Process -FilePath "powershell" -Verb runAs
$startExe = New-Object System.Diagnostics.ProcessStartInfo -Args PowerShell.exe
$startExe.verbs
Start-Process -FilePath "powershell.exe" -Verb open
Start-Process -FilePath "powershell.exe" -Verb runas
#>
Get-help -Name Start-Process -Full
Get-help -Name Start-Process -Online
powershell /?
# Results
<#
PowerShell[.exe] [-PSConsoleFile <file> | -Version <version>]
[-NoLogo] [-NoExit] [-Sta] [-Mta] [-NoProfile] [-NonInteractive]
[-InputFormat {Text | XML}] [-OutputFormat {Text | XML}]
[-WindowStyle <style>] [-EncodedCommand <Base64EncodedCommand>]
[-ConfigurationName <string>]
[-File <filePath> <args>] [-ExecutionPolicy <ExecutionPolicy>]
[-Command { - | <script-block> [-args <arg-array>]
| <string> [<CommandParameters>] } ]
...
-Command
Executes the specified commands (and any parameters) as though they were
typed at the Windows PowerShell command prompt, and then exits, unless
NoExit is specified. The value of Command can be "-", a string. or a
script block.
If the value of Command is "-", the command text is read from standard
input.
If the value of Command is a script block, the script block must be enclosed
in braces ({}). You can specify a script block only when running PowerShell.exe
in Windows PowerShell. The results of the script block are returned to the
parent shell as deserialized XML objects, not live objects.
If the value of Command is a string, Command must be the last parameter
in the command , because any characters typed after the command are
interpreted as the command arguments.
To write a string that runs a Windows PowerShell command, use the format:
"& {<command>}"
where the quotation marks indicate a string and the invoke operator (&)
causes the command to be executed.
...
#>
Start-Prozess (Microsoft.PowerShell.Management ...) https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/start-process?view=powershell-7
Parameter
-ArgumentList Gibt Parameter oder Parameterwerte an, die verwendet werden sollen, wenn dieses Cmdlet den Prozess startet. Argumente können als einzelne Zeichenfolge mit durch Leerzeichen getrennten Argumenten oder als Array von durch Kommas getrennten Zeichenfolgen akzeptiert werden.
Wenn Parameter oder Parameterwerte ein Leerzeichen enthalten, müssen sie in maskierte Anführungszeichen eingeschlossen werden. Weitere Informationen finden Sie unter about_Quoting_Rules.
Das Ausführen eines Befehls über ein Cmdlet oder powershell.exe sind zwei verschiedene Dinge. Beide haben ihre eigenen Anführungszeichen. Sie erhalten diese Art von Fehlern aufgrund einer falschen Syntax, die erforderliche Anführungszeichen enthält.
Für Ihren Anwendungsfall würde Start-Process also etwa so aussehen:
$ConsoleCommand = "Copy-Item \\Zuul\IT\ffmpeg -Destination 'C:\Program Files\' -Force -Recurse"
Start-Process powershell -ArgumentList '-NoExit',"-Command &{ $ConsoleCommand }"
Für PowerShell.exe etwa Folgendes:
PowerShell -Command {Copy-Item \\Zuul\IT\ffmpeg -Destination 'C:\Program Files\' -Force -Recurse}
Oder dieses
PowerShell -Command "& {Copy-Item \\Zuul\IT\ffmpeg -Destination 'C:\Program Files\' -Force -Recurse}"
Sie können kombiniert werden. Sagen wir, Sie sind in ISE/VScode und möchten einen Befehl an eine neue Instanz ausgeben, während Sie in ISE/VSCode bleiben. Dann etwa so:
Function Start-ConsoleCommand
{
[CmdletBinding(SupportsShouldProcess)]
[Alias('scc')]
Param
(
[string]$ConsoleCommand,
[switch]$PoSHCore
)
If ($PoSHCore)
{Start-Process pwsh -ArgumentList "-NoExit","-Command &{ $ConsoleCommand }" -Wait}
Else
{Start-Process powershell -ArgumentList "-NoExit","-Command &{ $ConsoleCommand }" -Wait}
}