PowerShell -arg

Telvanis

Lt. Junior Grade
Registriert
Dez. 2015
Beiträge
333
Moin, ich bin ein absoluter Anfänger, was PowerShell angeht und habe von meinem Ausbilder die Aufgabe bekommen, Firefox so zu "verändern", dass das Programm per SCCM installiert werden kann. Ich nehme einfach mal an, dass er damit ein PS Script meint, in dem dann so ein paar Ersteinstellungen und eine silent Installation und sowas stehen.
Folgendes habe ich bereits geschafft:
Code:
$Var = Get-WmiObject Win32_ComputerSystem | Select-Object UserName
$username= $Var.UserName.Remove(0,4)

start-process msiexec -arg "-i FirefoxESR-52.0-de.msi /qn /norestart /l C:\Users\$username\Desktop\FirefoxLog.txt"

[string]$Location = "C:\ProgramFiles(x86)\MozillaFirefox"
New-Item -Path $Location -Name "autoconfig.js" -ItemType File -force -value 'pref("general.config.filename", "mozilla.cfg"); pref("general.config.obscure_value", 0);'
New-Item -Path $Location -Name "mozilla.cfg" -ItemType File -force -Value'
Nach dem Value würde dann halt noch ne Einstellung kommen.

Mein Problem ist jetzt, dass ich meinem Ausbilder natürlich auch erklären können muss, was welcher Befehl denn tut... So schwer erscheint mir das alles nicht, allerdings habe ich ein Problem mit "-arg". Was genau macht dieser Befehl? Gibt er einfach der Installation noch Parameter wie /qn mit oder macht er doch etwas anderes?

Dankeschön für die Antworten :)
Telvanis
 
-arg sind die Argumente, die Du dem Prozess msiexec übergibst

also in der CMD würde die Zeile ja so aussehen:
msiexec.exe -i FirefoxESR-52.0-de.msi /qn /norestart /l C:\Users\$username\Desktop\FirefoxLog.txt
 
Ahh ok, also benötige ich -arg auf jeden Fall, um der Installation Parameter wir /qn und /norestart und so mitzugeben?!
 
-arg gehört zu start-process.

Gib doch mal spasshalber ein:

get-help start-process

Da siehst du dass -arg die kurze Schreibweise von -ArgumentList ist ...
 
PS: Der Pfad "C:\ProgramFiles(x86)\MozillaFirefox" stimmt nicht im Script, da fehlt ein Leerzeichen zwischen Mozilla und Firefox :)
 
d2boxSteve schrieb:
Da siehst du dass -arg die kurze Schreibweise von -ArgumentList ist ...
Nicht wirklich...
https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.management/start-process#-argumentlist schrieb:
-ArgumentList

Specifies parameters or parameter values to use when this cmdlet starts the process.

Type: String[]
Parameter Sets: (All)
Aliases: Args

Required: False
Position: 1
Default value: None
Accept pipeline input: False
Accept wildcard characters: False
Der Alias ist -Args. -arg funktioniert nur, weil es bei PowerShell ausreicht die Parameter nur so weit auszuschreiben, dass diese eindeutig zuordenbar sind. Für -ArgumentList reicht auch -a komplett aus, denn es gibt keinen anderen Parameter der mit a beginnt.
 
Telvanis schrieb:
[...], dass das Programm per SCCM installiert werden kann. Ich nehme einfach mal an[...]
Ich nehme mal an, dass ihr eine Active Directory Domain habt!?

Code:
$Var = Get-WmiObject Win32_ComputerSystem | Select-Object UserName
$username= $Var.UserName.Remove(0,4)

start-process msiexec -arg "-i FirefoxESR-52.0-de.msi /qn /norestart /l C:\Users\$username\Desktop\FirefoxLog.txt"
Den Desktop-Pfad des angemeldeten Benutzers am Computer kannst du auch leichter erhalten.
Hab dir mal zur kleinen Hilfe am Anfange deiner eventuellen PowerShell-Karriere ;) dein Script ein bisschen optimiert und kommentiert, damit du mal siehst wie man zumindest ein bisschen sauber mit PowerShell arbeiten kann.
Geht natürlich noch um einiges mehr als das von mir gezeigte. Besonders im Hinblick auf Deklaration durch den Variablen-Typ (da ist PowerShell aber in der Regel sehr intelligent).



Code:
#region Variablen-Definition
# Desktop-Pfad des aktuellen Benutzers:
$CurrentUserDesktopPath = "$env:USERPROFILE\Desktop" 

# MSI-Parameter:
$MSIFile = 'FirefoxESR-52.0-de.msi' 
$MSIArguments = "-i $MSIFile /qn /norestart /l $CurrentUserDesktopPath\FirefoxLog.txt" 

# Firefox Installations-Pfad 
$FirefoxInstallPath = "${Env:ProgramFiles(x86)}\Mozilla Firefox" 

# Firefox Configuration Files:   ( als PowerShell HERE-STRING -> https://blogs.technet.microsoft.com/heyscriptingguy/2015/12/31/powertip-use-here-strings-with-powershell/ )
$AutoConfigContent = @'
pref("general.config.filename", "mozilla.cfg"); 
pref("general.config.obscure_value", 0);'
'@ 

$MozillaConfigContent = @'
<tbd>;
'@ 
#endregion 


# Firefox durch MSInstaller installieren lassen und warten bis der Prozess beendet wurde (-Wait)
start-process msiexec.exe -ArgumentList $MSIArguments -Wait 

# Firefox AutoConfig-Datei mit vordefinierten Firefox-Einstellungen forciert erstellen 
New-Item -Path $FirefoxInstallPath -Name "autoconfig.js" -ItemType File -force -value $AutoConfigContent 

# Firefox MozillaConfig-Datei mit vordefinierten Firefox-Einstellungen forciert erstellen 
New-Item -Path $FirefoxInstallPath -Name "mozilla.cfg" -ItemType File -force -Value $MozillaConfigContent

Tipps für den Anfang:
  • Verwende aussagekräftige und strukturierte Variablen-Namen.
  • Verwende nie zu viel Text mit Variablen in einer Zeile. Macht alles unübersichtlich. Versuche Teil-Variablen zu erstellen und am Ende zusammenzufügen.
  • Kommentiere wo es geht
  • Packe zusammenhängende Blöcke zusammen mithilfe von #REGION Blöcken.
    Dadurch kannst du diese Blöcke ein- und ausklappen durch das + und - Zeichen links am Rand.
    Beispiel:
    Code:
    #region BlaBlaTextDerDenBlockBeschreibt
    ...deincode...
    #endregion
  • Verwende für Variablen die Zeilenumbrüche enthalten die sogenannten HERE-Strings.
    Ganz wichtig ist, dass das @" am Ende in einer eigenen Zeile und ganz links am Rand stehen muss. Da darf kein Leerzeichen zwischen Rand und @ sein!
    Hinter dem ersten "@ darf auch nichts stehen! Zur Entscheidung zwischen Hochkomma ' und Gänsefüßchen " -> siehe nächste Punkte.
    Beispiel:
    Code:
    $Variable = @"
    ...deinTextAuchMitVariablenMöglich...
    "@
  • Verwende das Hochkomma ' wenn die Variable nur Text enthält, also keine Variablen die aufgelöst werden.
    Beispiel:
    Code:
    $BlaBla = '<Dieser Wert wird NICHT aufgelöst>'
    $Variable = 'Hier sind zwar andere Variablen enthalten, sie werden aber nicht aufgelöst. $BlaBLa wird als $BlaBla angezeigt.'
    Write-Host $Variable -ForegroundColor Red
  • Verwende Gänsefüßchen " wenn die Variable auch andere Variablen enthält, die aufgelöst werden müssen.
    Beispiel:
    Code:
    $BlaBla = '<Dieser Wert wird aufgelöst>'
    $Variable = "Hier sind andere Variablen enthalten. $BlaBLa wird in den jeweiligen Wert umgewandelt. Wenn es keinen Wert hat, weil die Variable nicht existiert, wird ein leerer String angezeigt"
    Write-Host $Variable -ForegroundColor Green
 
Zuletzt bearbeitet:
Wow alles klar, vielen Dank für die zum Teil sehr ausführlichen Antworten :) Wird mir auf jeden fall helfen ^^
 
Zurück
Oben