2017-05-12 4 views
1

Ich habe ein Skript, das mit einem Ordnerauswahldialog startet, aber ich verstehe, dass POSH Skripts außerhalb von ISE nicht so ausführen kann (STA vs. MTA), also habe ich ein separates Skript zu dot-source es.Ordner Picker nicht außerhalb ISE

Ich habe die Fehlerbehandlung im ersten Skript für den Fall, drückt der Benutzer Abbrechen:

if ($Show -eq "OK") { 
    return $objForm.SelectedPath 
} else { 
    Write-Error "Operation cancelled by user." 
    exit 
} 

Jetzt brauche ich für das zweite Skript (die man das erste Skript aufrufen) die gleiche Annullierung zu erkennen. Diese

ist das, was ich bisher habe:

"Choose a folder containing the items to be moved..." 
"" 
try { 
    powershell -STA -File "C:\Test\Script.ps1" 
    "" 
    "Operation completed. An event log has been created:" 
    (Resolve-Path .\).Path +"\log.txt" 
    "" 
    "Press any key to continue..." 
    "" 
    $x = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") 
} catch { 
    if ($LastExitCode -ne 0) { exit $LastExitCode } 
    Write-Host "User cancelled the operation." 
    "" 
    "Press any key to continue..." 
    "" 
    $x = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") 
} 

Das gibt mir eine hässliche mehrzeiligen Schreibfehler Ausnahme im roten Text.

 
At C:\Test\Script.ps1:27 char:30 
+ $folder = Select-FolderDialog <<<< #contains user's selected folder 
    + CategoryInfo   : NotSpecified: (:) [Write-Error], WriteErrorException 
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Select-FolderDialog 

Ich bin nicht sicher, warum es eine Fehlermeldung das andere Skript Referenzierung zu erzeugen, da das andere Skript fein läuft (von ISE natürlich).

gewünschte Ausgabe:

Wenn Benutzerordner Picker abgebrochen, ich will nur eine schöne saubere Fehlermeldung angezeigt werden soll:

Benutzer den Vorgang abgebrochen.
Drücken Sie eine beliebige Taste, um fortzufahren.

bearbeiten

Hier ist das Skript Ordner Picker ich habe. Es funktioniert gut in ISE, aber wenn Sie mit der rechten Maustaste und wählen Sie Ausführen mit Powershell, es startet nur ein leeres Eingabeaufforderungsfenster. Um zu verhindern, dass der Endbenutzer das Skript versehentlich bearbeitet, möchte ich, dass es außerhalb von ISE läuft. Übrigens, ich bin mit POSH 2.

# Function for folder picker dialog 
Function Select-FolderDialog 
{ 
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null  

$objForm = New-Object System.Windows.Forms.FolderBrowserDialog 
# Default location is script's location 
$objForm.SelectedPath = (Resolve-Path .\).Path 
$objForm.Description = "Select Folder" 
$Show = $objForm.ShowDialog() 
If ($Show -eq "OK") 
{Return $objForm.SelectedPath} 
    Else 
    { 
    Write-Error "Operation cancelled by user." 
    Exit 
    } 
} 
$folder = Select-FolderDialog #contains user's selected folder 
+1

Also rufen Sie Skript eins (der Schuss) und das soll Skript zwei aufrufen? Was ist der Grund für das Zerlegen in separate Dateien? – restless1987

+1

Ich stimme restless1987 zu und verstehe nicht, warum Sie die Ordnerauswahl in ein eigenes Skript aufteilen. Persönlich habe ich nur eine Funktion, die ich in Skripten lasse, die sie brauchen, um den Ordnerauswahldialog auszuführen, aber es könnte ebenso einfach eine eigene .ps1-Datei sein, die ich Punktquelle, um die Funktion zu laden. Ich bin auch neugierig, warum Sie PowerShell so aufrufen und STA zwingen, das Skript zu laden. – TheMadTechnician

+0

Ich kann die Seite jetzt nicht finden, aber ich sah ein Forum bezüglich des Problems, das ich hatte. Alles war in Ordnung, bis mir klar wurde, dass das ursprüngliche Skript überhaupt nicht vom Explorer laufen würde, sondern nur innerhalb von ISE. Und jemand erwähnte, dass es ein Problem mit STA vs MTA (keine Ahnung) war und empfahl dann, ein zweites Skript zu erstellen, um es zu dot-source. Das hat funktioniert. Außer mir wurde schnell klar, dass es keine Fehlerbehandlung gab. Ich hätte gerne nur ein Skript. Aber wie bekomme ich es von außerhalb ISE zu arbeiten? – OatMaGoat

Antwort

0

nur Ihre Funktion in Ihrem zweiten Skript halten, dot die Quelle der Datei die Funktion zu laden, dann legen Sie den $folder = Select-FolderDialog Anruf in Ihrem Haupt-Skript, a la:

"Choose a folder containing the items to be moved..." 
"" 
try { 
    . "C:\Test\Script.ps1" # this dot sources the function from the second file (no need to call a separate Powershell process to do this, as data from that process won't be returned to the primary process calling it) 

    $folder = Select-FolderDialog # this runs the function in your original script, storing the result in the $folder variable 

    "" 
    "Operation completed. An event log has been created:" 
    (Resolve-Path .\).Path +"\log.txt" 
    "" 
    "Press any key to continue..." 
    "" 
    $x = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") 
} catch { 
    if ($LastExitCode -ne 0) { exit $LastExitCode } 
    Write-Host "User cancelled the operation." 
    "" 
    "Press any key to continue..." 
    "" 
    $x = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") 
} 
+0

Es scheint, dass diese Methode des Aufrufs des Skripts nicht ordnungsgemäß funktioniert (zumindest für meine Version). Es startet nur ein Powershell.exe-Fenster mit der Eröffnungsnachricht, aber nicht die Ordnerauswahl. Ich habe es mehrmals versucht. – OatMaGoat

+0

Es sieht irgendwie aus wie Versuch/Fang ist der Fehlerpunkt. Ich habe bemerkt, dass die Nachricht "Catch Host" nie erscheint. Selbst wenn die Funktion abgebrochen wird, heißt es nie "Benutzer hat den Vorgang abgebrochen". Also habe ich es entfernt, nur um zu sehen, was passieren würde und ich habe nur die dot-source- und host-Meldungen hinterlassen und es funktioniert genauso wie beim try/catch. – OatMaGoat

Verwandte Themen