Come eseguire un file EXE in PowerShell con parametri con spazi e virgolette


333

Come si esegue il comando seguente in PowerShell?

C: \ Programmi \ IIS \ Microsoft Web Deploy \ msdeploy.exe -verb: sync -source: dbfullsql = "Origine dati = mysource; Sicurezza integrata = false; ID utente = sa; Pwd = sapass!; Database = mydb;" -dest: dbfullsql = "Origine dati =. \ mydestsource; Sicurezza integrata = false; ID utente = sa; Pwd = sapass!; Database = mydb;", nomecomputer = 10.10.10.10, nome utente = amministratore, password = adminpass "



Se intendi litteraly "in PowerShell" (che interpreto intendo "all'interno di un prompt di PowerShell esistente), il seguente esempio può essere facilmente adattato per soddisfare le tue esigenze. Nota che non è necessario separare il comando dai suoi parametri: # Show any available updates to globally installed npm packages using the npm-check-updates tool [string] $cmd = 'ncu -g' Write-Verbose -Message $cmd Invoke-Command -ScriptBlock ([ScriptBlock]::Create($cmd))
user3785010

Non ho idea di come utilizzare il "mini-markdown" per modificare il commento sopra per far apparire ogni riga di codice su una riga separata e il limite di 5 minuti per la modifica del commento originale è scaduto. Se qualcuno ora sa usare "mini-markdown" per risolvere il problema, ripubblicherò in una forma più leggibile. La prima riga dovrebbe essere solo la seguente: # Mostra tutti gli aggiornamenti disponibili per i pacchetti npm installati a livello globale usando lo strumento npm-check-updates
user3785010

Risposte:


347

Quando PowerShell vede un comando che inizia con una stringa, valuta solo la stringa, ovvero, in genere viene ripetuta sullo schermo, ad esempio:

PS> "Hello World"
Hello World

Se si desidera che PowerShell interpreti la stringa come un nome di comando, utilizzare l'operatore di chiamata (&) in questo modo:

PS> & 'C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe'

Dopodiché probabilmente dovrai solo citare le coppie parametro / argomento che contengono spazi e / o caratteri di quotazione. Quando si richiama un file EXE come questo con argomenti della riga di comando complessi, è di solito molto utile disporre di uno strumento che mostrerà come PowerShell invia gli argomenti al file EXE. Le estensioni della community di PowerShell dispongono di tale strumento. Si chiama echoargs. Sostituisci semplicemente il file EXE con echoargs - lasciando tutti gli argomenti in atto e ti mostrerà come il file EXE riceverà gli argomenti, ad esempio:

PS> echoargs -verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass

Arg 0 is <-verb:sync>
Arg 1 is <-source:dbfullsql=Data>
Arg 2 is <Source=mysource;Integrated>
Arg 3 is <Security=false;User>
Arg 4 is <ID=sa;Pwd=sapass!;Database=mydb;>
Arg 5 is <-dest:dbfullsql=Data>
Arg 6 is <Source=.\mydestsource;Integrated>
Arg 7 is <Security=false;User>
Arg 8 is <ID=sa;Pwd=sapass!;Database=mydb; computername=10.10.10.10 username=administrator password=adminpass>

Utilizzando echoargs puoi sperimentare fino a quando non lo ottieni nel modo giusto, ad esempio:

PS> echoargs -verb:sync "-source:dbfullsql=Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;"
Arg 0 is <-verb:sync>
Arg 1 is <-source:dbfullsql=Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;>

Risulta che stavo provando troppo prima di mantenere le doppie virgolette attorno alla stringa di connessione. Apparentemente non è necessario perché anche cmd.exe li eliminerà.

A proposito, cappello al team di PowerShell. Sono stati molto utili nel mostrarmi l'incantesimo specifico delle virgolette singole e doppie per ottenere il risultato desiderato, se fosse necessario mantenere le doppie virgolette interne in atto. :-) Si rendono anche conto che questa è un'area di dolore, ma sono guidati dal numero di persone che sono colpite da un problema particolare. Se questa è un'area di dolore per te, allora vota questa presentazione di bug di PowerShell .

Per ulteriori informazioni sull'analisi di PowerShell, consultare la mia serie di blog efficaci su PowerShell , in particolare l' elemento 10 - "Informazioni sulle modalità di analisi di PowerShell"

AGGIORNAMENTO DEL 04/04/2012: questa situazione diventa molto più semplice da gestire in PowerShell V3. Vedi questo post del blog per i dettagli .


1
se utilizzo come secondo esempio, ottengo questo errore: Errore: Argomento non riconosciuto '"-source: dbfullsql =" "" Dati ". Tutti gli argomenti devono iniziare con "-".
Vans,

2
Mi dispiace, non capisco. Vedo che, attualmente, 6 persone hanno votato a favore della risposta, quindi mi manca qualcosa di ovvio, ma qual è la risposta effettiva? C'è una regola speciale da sapere sui parametri con spazi con PowerShell o stai solo suggerendo di prenderlo caso per caso, usando EchoArgs per aiutarti?
Tyler Collier,

Citare gli argomenti di solito è sufficiente ma non sempre. Nei casi in cui non funziona, l'utilizzo echoargsfornisce un'indicazione di come PowerShell sta interpretando gli argomenti prima che li passi su EXE.
Keith Hill,

1
Sai come lo farei in un file .bat? Sto provando & 'C:\Program Files\Sublime Text 3\sublime_text.exe'direttamente nella console e funziona, ma in un file batch ricevo un errore che dice "e in questo momento era inaspettato".
Joe Zim,

Non importa. Trovato:START C:\"Program Files"\"Sublime Text 3"\sublime_text.exe
Joe Zim,

61

Aggiungi l' operatore & prima del nome .exe. Ecco un comando per installare SQL Server Express in modalità silenziosa:

$fileExe = "T:\SQLEXPRADV_x64_ENU.exe"
$CONFIGURATIONFILE = "T:\ConfSetupSql2008Express.ini"

& $fileExe  /CONFIGURATIONFILE=$CONFIGURATIONFILE

53

Avevo spazi sia nel comando che nei parametri, e questo è ciò che ha funzionato per me:

$Command = "E:\X64\Xendesktop Setup\XenDesktopServerSetup.exe"
$Parms = "/COMPONENTS CONTROLLER,DESKTOPSTUDIO,DESKTOPDIRECTOR,LICENSESERVER,STOREFRONT /PASSIVE /NOREBOOT /CONFIGURE_FIREWALL /NOSQL"

$Prms = $Parms.Split(" ")
& "$Command" $Prms

Fondamentalmente è la stessa della risposta di Akira, ma funziona se costruisci dinamicamente i tuoi parametri di comando e li metti in una variabile.


2
imho questo è il migliore! nessuna base64, nessuna strana sintassi% che alterna la sostituzione, le normali regole di sostituzione della PowerShell, nessuna confusione, molto leggibile.
AnneTheAgile,

1
Questo non funziona Se il parametro contiene un nome percorso, il nome percorso verrà suddiviso in più parametri.
BrainSlugs83

1
Bella risposta. Tuttavia, funzionerà con le virgolette nei parametri?
Akira Yamamoto,

Per favore, prova questo, dopo tutto ciò che ha funzionato. E usa anche l'estensione PowershellEchoArgs
Jeremy Thompson

34

Questo ha funzionato per me:

& 'D:\Server\PSTools\PsExec.exe' @('\\1.1.1.1', '-accepteula', '-d', '-i', $id, '-h', '-u', 'domain\user', '-p', 'password', '-w', 'C:\path\to\the\app', 'java', '-jar', 'app.jar')

Basta inserire percorsi o stringhe di connessione in un elemento dell'array e dividere gli altri elementi in un elemento dell'array ciascuno.

Ci sono molte altre opzioni qui: https://social.technet.microsoft.com/wiki/contents/articles/7703.powershell-running-executables.aspx

Microsoft dovrebbe rendere questo modo più semplice e compatibile con la sintassi del prompt dei comandi.


2
L'array è sicuramente l'opzione migliore: per me ha funzionato alla grande. Tranne che ho passato una variabile di matrice perché i miei argomenti erano dinamici. Grazie.
Jon Barker,

La migliore soluzione di IMHO
Vasin Yuriy il

25

Ci sono alcuni metodi che puoi usare per farlo.

Esistono altri metodi come l'utilizzo dell'operatore di chiamata ( & ), del cmdlet Invoke-Expression ecc. Ma sono considerati non sicuri. Microsoft consiglia di utilizzare Start-Process .

Metodo 1

Un semplice esempio

Start-Process -NoNewWindow -FilePath "C:\wamp64\bin\mysql\mysql5.7.19\bin\mysql" -ArgumentList "-u root","-proot","-h localhost"

Nel tuo caso

Start-Process -NoNewWindow -FilePath "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -ArgumentList "-verb:sync","-source:dbfullsql=`"Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;`"","-dest:dbfullsql=`"Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;`"","computername=10.10.10.10","username=administrator","password=adminpass"

In questo metodo si separano tutti i parametri nell'ArgumentList utilizzando le virgole.

Metodo 2

Esempio semplice

Start-Process -NoNewWindow -FilePath "C:\wamp64\bin\mysql\mysql5.7.19\bin\mysql" -ArgumentList "-u root -proot -h localhost"

Nel tuo caso

Start-Process -NoNewWindow -FilePath "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -ArgumentList "-verb:sync -source:dbfullsql=`"Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;`" -dest:dbfullsql=`"Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;`",computername=10.10.10.10,username=administrator,password=adminpass"

Questo metodo è più semplice in quanto consente di digitare i parametri in una volta sola.

Si noti che in PowerShell per rappresentare le virgolette (") in una stringa è necessario inserire l' accento grave (`) (Questo è il tasto sopra il tasto Tab nella tastiera degli Stati Uniti).

-Il parametro NoNewWindow viene utilizzato per visualizzare il nuovo processo nella finestra della console corrente. Per impostazione predefinita, Windows PowerShell apre una nuova finestra.

Riferimenti: Powershell / Scripting / Start-Process


Semplice vince sempre! Grazie.
Mike Casas,

Grazie per la nota finale per sfuggire alle virgolette!
Paolo,


13

Nel caso qualcuno si stia chiedendo come eseguire un file eseguibile:

.....>. \ file.exe

o

......> full \ path \ to \ file.exe


2
Questa dovrebbe essere la risposta a questa domanda, è quello che stiamo cercando quando cerchiamo le parole chiave "Avvia EXE da PowerShell". Grazie !
Jean-Daniel Gasser,

2
Che ne dici di correre con gli argomenti?
SereneWizard,

1
@SereneWizard Bene, aggiungili dopo .exe con uno spazio tra. Esempio:. \ File.exe param1 param2 param3
darkgaze

9

Sono stato in grado di far funzionare il mio comando simile usando il seguente approccio:

msdeploy.exe -verb=sync "-source=dbFullSql=Server=THESERVER;Database=myDB;UID=sa;Pwd=saPwd" -dest=dbFullSql=c:\temp\test.sql

Per il tuo comando (non che ora aiuti molto), le cose sembrerebbero qualcosa del genere:

msdeploy.exe -verb=sync "-source=dbfullsql=Server=mysource;Trusted_Connection=false;UID=sa;Pwd=sapass!;Database=mydb;" "-dest=dbfullsql=Server=mydestsource;Trusted_Connection=false;UID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass

I punti chiave sono:

  • Utilizzare le virgolette attorno all'argomento source e rimuovere le virgolette incorporate intorno alla stringa di connessione
  • Utilizzare i nomi di chiave alternativi nella creazione della stringa di connessione SQL che non contiene spazi. Ad esempio, utilizzare "UID" anziché "ID utente", "Server" anziché "Origine dati", "Trusted_Connection" anziché "Sicurezza integrata" e così via. Sono stato in grado di farlo funzionare solo dopo aver rimosso tutti gli spazi dalla stringa di connessione.

Non ho provato ad aggiungere la parte "nomecomputer" alla fine della riga di comando, ma spero che queste informazioni aiuteranno gli altri a leggere questo ora avvicinarsi al risultato desiderato.


2
Ho provato tutte le altre risposte, ma questa è stata l'unica risposta che ha funzionato per me! Grazie per aver fornito questo percorso alternativo.
Sentient,

6

Nuova stringa di escape in PowerShell V3, citata da Nuove funzionalità del linguaggio V3 :

Riutilizzo più semplice delle righe di comando da Cmd.exe

Il web è pieno di righe di comando scritte per Cmd.exe. Queste righe di comando funzionano abbastanza spesso in PowerShell, ma quando includono determinati caratteri, ad esempio un punto e virgola (;), un segno di dollaro ($) o parentesi graffe, è necessario apportare alcune modifiche, probabilmente aggiungendo alcune virgolette. Questo sembrava essere la fonte di molti piccoli mal di testa.

Per aiutare a risolvere questo scenario, abbiamo aggiunto un nuovo modo per "sfuggire" all'analisi delle righe di comando. Se usi un parametro magico -%, interrompiamo il nostro normale analisi della tua riga di comando e passiamo a qualcosa di molto più semplice. Non abbiniamo le virgolette. Non ci fermiamo al punto e virgola. Non espandiamo le variabili di PowerShell. Espandiamo le variabili di ambiente se si utilizza la sintassi Cmd.exe (ad esempio% TEMP%). A parte questo, gli argomenti fino alla fine della riga (o pipe, se stai eseguendo il piping) vengono passati così come sono. Ecco un esempio:

PS> echoargs.exe --% %USERNAME%,this=$something{weird}
Arg 0 is <jason,this=$something{weird}>

6

Puoi usare:

Start-Process -FilePath "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -ArgumentList "-verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass"

La cosa fondamentale da notare qui è che FilePath deve essere in posizione 0, secondo la Guida. Per invocare la Guida di aiuto per un commandlet, basta digitare Get-Help <Commandlet-name> -Detailed. In questo caso, lo è Get-Help Start-Process -Detailed.


5

Ho provato tutti i suggerimenti ma non ero ancora in grado di eseguire msiexec.exeparametri con spazi. Quindi la mia soluzione ha finito per usare System.Diagnostics.ProcessStartInfo:

# can have spaces here, no problems
$settings = @{
  CONNECTION_STRING = "... ..."
  ENTITY_CONTEXT = "... ..."
  URL = "..."
}

$settingsJoined = ($settings.Keys | % { "$_=""$($settings[$_])""" }) -join " "
$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.WorkingDirectory = $ScriptDirectory
$pinfo.FileName = "msiexec.exe"
$pinfo.RedirectStandardError = $true
$pinfo.RedirectStandardOutput = $true
$pinfo.UseShellExecute = $false
$pinfo.Arguments = "/l* install.log /i installer.msi $settingsJoined"
$p = New-Object System.Diagnostics.Process
$p.StartInfo = $pinfo
$p.Start() | Out-Null
$p.WaitForExit()
$stdout = $p.StandardOutput.ReadToEnd()

3

Questo ha funzionato per me:

PowerShell.exe -Command "& ""C:\Some Script\Path With Spaces.ps1"""

La chiave sembra essere che l'intero comando sia racchiuso tra virgolette esterne, la e commerciale "&" viene utilizzata per specificare che è in esecuzione un altro file di comando figlio, quindi infine le virgolette (doppie-doppie raddoppiate) attorno al percorso / nome file con spazi in te volevi eseguire in primo luogo.

Questo è anche il completamento dell'unica soluzione al problema di MS connect che -File non restituisce codici di ritorno diversi da zero e -Command è l'unica alternativa. Ma fino ad ora si pensava che una limitazione di -Command fosse che non supportava gli spazi. Ho aggiornato anche quell'elemento di feedback.

http://connect.microsoft.com/PowerShell/feedback/details/750653/powershell-exe-doesn-t-return-correct-exit-codes-when-using-the-file-option


1
Questo non è correlato alla domanda sulle operazioni, ha specificamente chiesto come eseguire il comando lungo nel suo post in PowerShell. Non come eseguire uno script PowerShell con spazi nel percorso del file.
leinad13,

Leggi il titolo della domanda, gli spazi non sono la lunghezza del problema. Questa è una risposta valida a tali problemi, quindi vale la pena condividerla. Hai avuto lo stesso problema e davvero provarlo? Se vuoi migliorarlo invia una modifica che include il comando effettivo nella domanda e lo accetterò.
Tony Wall,

3

Una risposta alternativa è utilizzare un'opzione di comando codificata Base64 :

powershell -EncodedCommand "QwA6AFwAUAByAG8AZwByAGEAbQAgAEYAaQBsAGUAcwBcAEkASQBTAFwATQBpAGMAcgBvAHMAbwBmAHQAIABXAGUAYgAgAEQAZQBwAGwAbwB5AFwAbQBzAGQAZQBwAGwAbwB5AC4AZQB4AGUAIAAtAHYAZQByAGIAOgBzAHkAbgBjACAALQBzAG8AdQByAGMAZQA6AGQAYgBmAHUAbABsAHMAcQBsAD0AIgBEAGEAdABhACAAUwBvAHUAcgBjAGUAPQBtAHkAcwBvAHUAcgBjAGUAOwBJAG4AdABlAGcAcgBhAHQAZQBkACAAUwBlAGMAdQByAGkAdAB5AD0AZgBhAGwAcwBlADsAVQBzAGUAcgAgAEkARAA9AHMAYQA7AFAAdwBkAD0AcwBhAHAAYQBzAHMAIQA7AEQAYQB0AGEAYgBhAHMAZQA9AG0AeQBkAGIAOwAiACAALQBkAGUAcwB0ADoAZABiAGYAdQBsAGwAcwBxAGwAPQAiAEQAYQB0AGEAIABTAG8AdQByAGMAZQA9AC4AXABtAHkAZABlAHMAdABzAG8AdQByAGMAZQA7AEkAbgB0AGUAZwByAGEAdABlAGQAIABTAGUAYwB1AHIAaQB0AHkAPQBmAGEAbABzAGUAOwBVAHMAZQByACAASQBEAD0AcwBhADsAUAB3AGQAPQBzAGEAcABhAHMAcwAhADsARABhAHQAYQBiAGEAcwBlAD0AbQB5AGQAYgA7ACIALABjAG8AbQBwAHUAdABlAHIAbgBhAG0AZQA9ADEAMAAuADEAMAAuADEAMAAuADEAMAAsAHUAcwBlAHIAbgBhAG0AZQA9AGEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIALABwAGEAcwBzAHcAbwByAGQAPQBhAGQAbQBpAG4AcABhAHMAcwAiAA=="

Una volta decodificato, vedrai che è lo snippet originale dell'OP con tutti gli argomenti e le doppie virgolette conservate.

powershell.exe -EncodedCommand

Accepts a base-64-encoded string version of a command. Use this parameter
to submit commands to Windows PowerShell that require complex quotation
marks or curly braces.

Il comando originale:

 C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe -verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass"

Si trasforma in questo quando codificato come Base64:

QwA6AFwAUAByAG8AZwByAGEAbQAgAEYAaQBsAGUAcwBcAEkASQBTAFwATQBpAGMAcgBvAHMAbwBmAHQAIABXAGUAYgAgAEQAZQBwAGwAbwB5AFwAbQBzAGQAZQBwAGwAbwB5AC4AZQB4AGUAIAAtAHYAZQByAGIAOgBzAHkAbgBjACAALQBzAG8AdQByAGMAZQA6AGQAYgBmAHUAbABsAHMAcQBsAD0AIgBEAGEAdABhACAAUwBvAHUAcgBjAGUAPQBtAHkAcwBvAHUAcgBjAGUAOwBJAG4AdABlAGcAcgBhAHQAZQBkACAAUwBlAGMAdQByAGkAdAB5AD0AZgBhAGwAcwBlADsAVQBzAGUAcgAgAEkARAA9AHMAYQA7AFAAdwBkAD0AcwBhAHAAYQBzAHMAIQA7AEQAYQB0AGEAYgBhAHMAZQA9AG0AeQBkAGIAOwAiACAALQBkAGUAcwB0ADoAZABiAGYAdQBsAGwAcwBxAGwAPQAiAEQAYQB0AGEAIABTAG8AdQByAGMAZQA9AC4AXABtAHkAZABlAHMAdABzAG8AdQByAGMAZQA7AEkAbgB0AGUAZwByAGEAdABlAGQAIABTAGUAYwB1AHIAaQB0AHkAPQBmAGEAbABzAGUAOwBVAHMAZQByACAASQBEAD0AcwBhADsAUAB3AGQAPQBzAGEAcABhAHMAcwAhADsARABhAHQAYQBiAGEAcwBlAD0AbQB5AGQAYgA7ACIALABjAG8AbQBwAHUAdABlAHIAbgBhAG0AZQA9ADEAMAAuADEAMAAuADEAMAAuADEAMAAsAHUAcwBlAHIAbgBhAG0AZQA9AGEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIALABwAGEAcwBzAHcAbwByAGQAPQBhAGQAbQBpAG4AcABhAHMAcwAiAA==

ed ecco come replicare a casa:

$command = 'C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe -verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass"'
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
$encodedCommand = [Convert]::ToBase64String($bytes)
$encodedCommand

#  The clip below copies the base64 string to your clipboard for right click and paste.
$encodedCommand | Clip

3

È possibile eseguire file exe in PowerShell in diversi modi. Ad esempio, se vuoi eseguire unrar.exe ed estrarre un file .rar puoi semplicemente scrivere in powershell questo:

$extract_path = "C:\Program Files\Containing folder";
$rar_to_extract = "C:\Path_to_arch\file.rar"; #(or.exe if its a big file)  
C:\Path_here\Unrar.exe x -o+ -c- $rar_to_extract $extract_path;

Ma a volte questo non funziona, quindi è necessario utilizzare il parametro & come mostrato sopra: Ad esempio, con vboxmanage.exe (uno strumento per gestire le macchine virtuali di virtualbox) è necessario chiamare i parametri fuori dalla stringa in questo modo, senza virgolette:

> $vmname = "misae_unrtes_1234123"; #(name too long, we want to change this)
> & 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' modifyvm $vmname --name UBUNTU;

Se si desidera chiamare semplicemente un file WinRar archiviato come file .exe, è anche possibile decomprimerlo con il cmdlet invoke-command e un parametro / S silenzioso (si estrarrà nella stessa cartella rispetto a dove è stato compresso).

> Invoke-Command -ScriptBlock { C:\Your-path\archivefile.exe /S };

Quindi ci sono diversi modi per eseguire file .exe con argomenti in PowerShell.

A volte, è necessario trovare una soluzione alternativa per farlo funzionare correttamente, il che può richiedere ulteriori sforzi e dolore :) a seconda del modo in cui .exe è stato compilato o fatto diventare i suoi creatori.


1

Uso questo metodo semplice, pulito ed efficace.

Metto argomenti in un array, 1 per riga. In questo modo è molto facile da leggere e modificare. Quindi uso un semplice trucco per passare tutti gli argomenti tra virgolette doppie a una funzione con 1 parametro singolo. Ciò li appiattisce, compresi gli array, a una singola stringa, che quindi eseguo usando "Invoke-Expression" di PS. Questa direttiva è specificamente progettata per convertire una stringa in comando eseguibile. Funziona bene:

                    # function with one argument will flatten 
                    # all passed-in entries into 1 single string line
Function Execute($command) {
                    # execute:
    Invoke-Expression $command;
                    # if you have trouble try:
  # Invoke-Expression "& $command";
                    # or if you need also output to a variable
  # Invoke-Expression $command | Tee-Object -Variable cmdOutput;

}

#  ... your main code here ...

               # The name of your executable app
$app = 'my_app.exe';
               # List of arguments:
               #    Notice the type of quotes - important !
               #    Those in single quotes are normal strings, like 'Peter'
$args = 'arg1',
        'arg2',
        $some_variable,
        'arg4',
        "arg5='with quotes'",
        'arg6',
        "arg7 \ with \ $other_variable",
        'etc...';

               # pass all arguments inside double quotes
Execute "$app $args";

1

Ho avuto il seguente codice perfettamente funzionante sul mio laptop:

& $msdeploy `
-source:package="$publishFile" `
-dest:auto,computerName="$server",includeAcls="False",UserName="$username",Password="$password",AuthType="$auth" `
-allowUntrusted  `
-verb:sync  `
-enableRule:DoNotDeleteRule `
-disableLink:AppPoolExtension  `
-disableLink:ContentExtension  `
-disableLink:CertificateExtension  `
-skip:objectName=filePath,absolutePath="^(.*Web\.config|.*Environment\.config)$" `
-setParam:name=`"IIS Web Application Name`",value="$appName"

Quindi quando ho provato a eseguirlo direttamente su un server ho iniziato a ricevere quegli errori "Unrecognized argument ...etc.... All arguments must begin with "-". "

Dopo aver provato tutte le possibili soluzioni alternative (nessun successo), ho scoperto che Powershell sul server (Windows 2008 R2) era la versione 3.0, mentre il mio laptop ha 5.0. (puoi vedere "$ PSVersionTable" per vedere la versione).

Dopo aver aggiornato Powershell all'ultima versione, ha ripreso a funzionare.


1

Cmd può gestire l'esecuzione di un exe citato, ma Powershell no. Mi occuperò solo di gestire l'exe stesso, dal momento che non ce l'ho. Se hai letteralmente bisogno di inviare doppie virgolette a un argomento di un comando esterno, questo è un altro problema che è stato trattato altrove.

1) aggiungi la cartella exe al tuo percorso, magari nel tuo profilo $

$env:path += ';C:\Program Files\IIS\Microsoft Web Deploy\'
msdeploy

2) backquote gli spazi:

C:\Program` Files\IIS\Microsoft` Web` Deploy\msdeploy.exe

0

Quindi, ho riscontrato un problema simile e ho scelto invece di risolverlo in questo modo:

  1. Sfuggire alla virgoletta (") caratteri con un backtick (`)
  2. Circonda la tua nuova espressione tra virgolette (")
  3. Utilizzando l'operatore di chiamata (&), immettere il comando invoke-expressionsulla nuova stringa

Soluzione di esempio:

& {invoke-expression "C: \ Programmi \ IIS \ Microsoft Web Deploy \ msdeploy.exe -verb: sync -source: dbfullsql =` "Origine dati = mysource; Sicurezza integrata = false; ID utente = sa; Pwd = sapass !; Database = mydb; `" -dest: dbfullsql = `" Origine dati =. \ Mydestsource; Sicurezza integrata = false; ID utente = sa; Pwd = sapass!; Database = mydb; `", nomecomputer = 10.10.10.10, username = amministratore, password = adminpass` ""}


0

Per il nome dell'eseguibile, il cmdlet new-alias può essere utilizzato per evitare di occuparsi di spazi o di dover aggiungere l'eseguibile all'ambiente $ PATH.

PS> new-alias msdeploy "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe"
PS> msdeploy ...

Per elencare o modificare gli alias PS vedi anche

PS> get-alias
PS> set-alias

Da Jeffery Hicks Aarticle

Altre risposte affrontano gli argomenti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.