Powershell Pfad vom USB Stick lesen, Laufwerkbuchstaben neu zuordnen

sniper8952

Lt. Junior Grade
Registriert
Juni 2008
Beiträge
353
Hallo Zusammen

Ich habe folgendes Script im Powershell:

Set-ExecutionPolicy Unrestricted -Scope CurrentUser -force

Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

choco install vlc -y --acceptlicense # (CMD)
Invoke-Expression -Command "choco install vlc -y --acceptlicense" # (PowerSHELL)

choco install adobereader -y --acceptlicense # (CMD)
Invoke-Expression -Command "choco install adobereader -y --acceptlicense" # (PowerSHELL)

choco install teamviewer -y --acceptlicense # (CMD)
Invoke-Expression -Command "choco install teamviewer -y --acceptlicense" # (PowerSHELL)

choco install firefox -y --acceptlicense # (CMD)
Invoke-Expression -Command "choco install firefox -y --acceptlicense" # (PowerSHELL)

choco install googlechrome -y --acceptlicense # (CMD)
Invoke-Expression -Command "choco install google-chrome -y --acceptlicense" # (PowerSHELL)

choco install microsoft-edge -y --acceptlicense # (CMD)
Invoke-Expression -Command "choco install microsoft-edge -y --acceptlicense" # (PowerSHELL)


Import-StartLayout -LayoutPath D:\Kundeninstallation\Startlayout.xml -MountPath $env:SystemDrive\ -verbose

Ich möchte das beim importieren nach einem USB Stick gesucht wird oder ich den Laufwerkbuchstaben neu vergebe.

Mein jetztiges Problem ist nämlich, dass wenn ein CD Laufwerk vorhanden ist, dann dieser den Laufwerkbuchstaben D: hat und dann mein Script nicht funktioniert.

Wie kann ich den Pfad angeben ohne das ich, dass Script immer wieder ändern muss?

Gruss

Sniper8952
 
Code:
$usbDrive = Get-WmiObject Win32_Volume -Filter "DriveType='2'"
Set-WmiInstance -InputObject $usbDrive -Arguments @{DriveLetter = "U:"}



DriveType

2 (0x2)Removable Disk
Quelle: docs.microsoft.com
 
Wenn das Script auf dem Stick liegt, kannst du den Pfad auch einfach relativ setzen oder absolut auflösen lassen. Sonst einfach was @derlorenz sagt in Verbindung mit Test-Path auf die Datei und gut.
 
sniper8952 schrieb:
wie meinst du das einfach relativ setzen?
Na wenn dein Script ebenso mit auf dem Stick liegt, kannst du die XML einfach relativ zum Laufwerk via \Kundeninstallation\Startlayout.xml setzen. Wenn das Script unter D:\Kundeninstallation liegt, kannst du es auch via .\Startlayout.xml referenzieren.
 
  • Gefällt mir
Reaktionen: derlorenz
Also mein Script und die Datei liegt im USB Drive D:\Kundeninstallation

Wenn ich jetzt .\Startlayout.xml mache dann sucht er die Datei im C:\Windows\System32\Kundeninstallation

Was falsch ist.
 
Dann referenzier einfach via
Code:
Import-StartLayout -LayoutPath .\Startlayout.xml -MountPath $env:SystemDrive\ -verbose
 
Sehr wahrscheinlich such er im C:\Windows\System32\ weil ich das Powershell dort geöffnet habe?
 
Ja, er geht halt immer relativ vom Arbeitsverzeichnis auf. Ne PowerShell Konsole als Admin hat als Arbeitsverzeichnis standardmäßig den Pfad gesetzt. Du kannst auch $PSScriptRoot nutzen, was dir den absoluten Pfad zum Script gibt.
Code:
Import-StartLayout -LayoutPath "$PSScriptRoot\StartLayout.xml" -MountPath $env:SystemDrive\ -verbose
Siehe
Code:
PS C:\Windows\System> cat C:\tmp\path.ps1                                                                                    
Write-Host $PSScriptRoot
Write-Host "$PSScriptRoot\foobar.xml"
PS C:\Windows\System> C:\tmp\path.ps1
C:\tmp
C:\tmp\foobar.xml
PS C:\Windows\System>
 
Nein, funktioniert leider immer noch nicht..

PS C:\Windows\system32> Import-StartLayout -LayoutPath "$PSScriptRoot\Startlayout.xml" -MountPath $env:SystemDrive\ -verbose

Die Fehlermeldung:
Import-StartLayout : Der Pfad "C:\Startlayout.xml" kann nicht gefunden werden, da er nicht vorhanden ist.
In Zeile:1 Zeichen:1
  • Import-StartLayout -LayoutPath "$PSScriptRoot\Startlayout.xml" -Mount ...
  • ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\Startlayout.xml:String) [Import-StartLayout], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.Windows.StartLayout.Commands.ImportStartLayoutCommand
 
Das muss auch im Script stehen, $PSScriptRoot existiert nur dort und du musst das Script ausführen. Auf der Konsole selbst existiert diese Variable nicht.
 
Ich kann das Script jedoch nur im ISE ausführen...

Ich kann jetzt mit diesem Befehl den Driveletter auslesen. Jedoch wie kann ich den Pfad mit dem Driveletter verknüpfen? Oder den in eine Variable rein schreiben?

get-volume | where drivetype -eq removable | foreach driveletter
 
Zuletzt bearbeitet:
sniper8952 schrieb:
Ich kann das Script jedoch nur im ISE ausführen...
Dann musst du dort nur das Script öffnen.

1602245953854.png
 
Verstehe ich nicht ich habs jetzt noch anders versucht nämlich mit if

if (D:\Kundeninstallation\Startlayout.xml) {Import-StartLayout -LayoutPath D:\Kundeninstallation\Startlayout.xml -MountPath $env:SystemDrive\ -verbose}
elseif (E:\Kundeninstallation\Startlayout.xml) {Import-StartLayout -LayoutPath E:\Kundeninstallation\Startlayout.xml -MountPath $env:SystemDrive\ -verbose}

Diese funktioniert jedoch auch nicht. Hab ich einen Fehler drin?
 
If was denn? Dominosteine? Alle Sprachen sind ausreichend exakt, daß man das erklären muß, was man will. 3 4 = ? Keine Ahnung, da kein Operator.

besser in Ps: Datei/OrdnerObjekte verwenden und mit Get-Item arbeiten. Dann gibts auch $Datei.Exists als Bool und $Datei.Fullname als absoluten Pfad.
Get-Item mault dann schon, wenn es die angegeben Pfad nicht findet.

Ps - F5 in der ise führt das komplette Script aus und setzt alle automatischen variablen wie psscriptroot. F9 setzt breakpoint zum Debugging. Und psscriptroot gibts erst ab Ps v3, daher falls win7 und nie ein Update von ps gemacht, erst eine aktuelle powershell drauf tun.

wenn das nicht geht wegen os nicht unter Kontrolle, dann den Umweg über
split-path -parent $myinvocation.mycommand.path .
 
Zurück
Oben