Benutzer mit den meisten Antworten
Erstellung benutzerdefinierter SendTo-Links mit PowerShell

Frage
-
Hallo Community,
zur Vereinfachung eines Transferprozesses möchte ich gerne benutzerdefinierte SendTo-Links erstellen, die ein PowerShell-Script aufrufen. In diesem PowerShell-Script finden einige Vorarbeiten und Vorabprüfungen statt, bevor die Daten kopiert werden.
Nach dem Kopiervorgang finden noch ein paar Nacharbeiten statt. Mein Problem: Wenn ich das Script in der PowerShell ISE teste, klappt alles problemlos. Wenn ich das Script aus der cmd mit folgendem Aufruf starte, tritt ein Fehler auf, den ich nicht nachvollziehen kann, da er nicht angezeigt wird. Auch der Aufruf als Verknüpfung mit diesem Befehl klappt nicht.
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -windowstyle hidden -ExecutionPolicy bypass -file \\server\share\Script.ps1 -SourceFile
Da sich das Fenster sehr schnell schließt, habe ich keine Möglichkeit, den Fehler nachzuvollziehen. Auch Kommandos wie Start-Sleep oder pause werden ignoriert. Ich vermute, dass der Pfad nicht richtig übergeben wurde. Leider wird auch die Auswertung des Error-Arrays mit Protokolliereung in ein Textfile ignoriert.
Das Script sieht aktuell so aus:
Param ( # Source File or Folder [Parameter(Mandatory=$true, Position=1)] [string]$SourceFile ) <# .Synopsis Short description .DESCRIPTION Long description .EXAMPLE Example of how to use this cmdlet .EXAMPLE Another example of how to use this cmdlet #> function Send-Data { [CmdletBinding()] Param ( # Source File or Folder [Parameter(Mandatory=$true, Position=1)] [string]$SourceFile, # Destination Switch: Production [Parameter(Mandatory=$true, ParameterSetName="Production")] [switch] $Production, # Destination Switch: Integration [Parameter(Mandatory=$true, ParameterSetName="Integration")] [switch]$Integration ) Add-Type -AssemblyName PresentationFramework $TransferServer="server" ## Hier UTA-Transferserver eintragen $StartTransferSuffix=".go" $OutgoingFolder="\\$TransferServer\out" if(Test-Connection $TransferServer -Quiet) { switch($PSCmdlet.ParameterSetName) { "Production" { $DestinationPrefix="prod" break; } "Integration" { $DestinationPrefix="int" } default { [System.Windows.MessageBox]::Show("Achtung Fehlkonfiguration! Es wurde kein gültiges Ziel angegeben oder das Ziel ist noch nicht erfasst.", "Fehler", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Error) } } Copy-Item -Path $SourceFile -Destination $OutgoingFolder -Recurse -Force $FileOrFolderName=Split-Path -Path $SourceFile -Leaf $SourcePath=Split-Path -Path $SourceFile -Parent if((Get-ChildItem -Path $SourcePath | where {$_.Name -eq $FileOrFolderName}).Extension -eq [string]::Empty) { Get-ChildItem "$OutgoingFolder" -Directory | where {$_.Name -eq $FileOrFolderName} | Rename-Item -NewName "$DestinationPrefix$FileOrFolderName" } else { Get-ChildItem "$OutgoingFolder\$FileOrFolderName" -File | Rename-Item -NewName "$DestinationPrefix$FileOrFolderName" } if((Get-FileHash -Path $SourceFile -Algorithm SHA512).Hash -eq (Get-FileHash -Path "$OutgoingFolder\$DestinationPrefix$FileOrFolderName" -Algorithm SHA512).Hash) { New-Item -Path $OutgoingFolder -Name "$DestinationPrefix$FileOrFolderName$StartTransferSuffix" -ItemType File -Force } else { [System.Windows.MessageBox]::Show("Beim Kopieren der Dateien ist ein Fehler aufgetreten. Dieser muss manuell behoben werden.", "Fehler", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Error) } } else { [System.Windows.MessageBox]::Show("Es konnte keine Verbindung zum Transferserver hergestellt werden.", "Fehler", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Error) } } Send-Data -Production -SourceFile $SourceFile pause Start-Sleep -Seconds ([int]::MaxValue) if($Error.Count -gt 0) { foreach($e in $Error) { $Text="Fehler: $e.Message $e.Stacktrace" $Text | Out-File c:\sendtoerror.txt -Append } }
Wie kann ich den Fehler hier ausfindig machen? Welche anderen Lösungen gibt es, um benutzerdefinierte SendTo-Ziele zu erstellen?
Vielen Dank
Update-Troubleshooter
Antworten
-
Hallo,
also mit dem ersten Blick faellt auf, dass du beim Aufruf den Parameter -SourceFile nutzt aber ohne Wert, diesen Parameter hast du im Script aber auf Pflicht gesetzt, also wird das Scirpt bei der Parameterpruefung aussteigen.
Beste Gruesse
brima
- Bearbeitet brima Donnerstag, 18. Januar 2018 09:42
- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Dienstag, 23. Januar 2018 11:20
- Als Antwort markiert Denniver ReiningMVP, Moderator Donnerstag, 25. Januar 2018 00:20
-
- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Dienstag, 23. Januar 2018 11:20
- Als Antwort markiert Denniver ReiningMVP, Moderator Donnerstag, 25. Januar 2018 00:20
Alle Antworten
-
Hallo,
also mit dem ersten Blick faellt auf, dass du beim Aufruf den Parameter -SourceFile nutzt aber ohne Wert, diesen Parameter hast du im Script aber auf Pflicht gesetzt, also wird das Scirpt bei der Parameterpruefung aussteigen.
Beste Gruesse
brima
- Bearbeitet brima Donnerstag, 18. Januar 2018 09:42
- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Dienstag, 23. Januar 2018 11:20
- Als Antwort markiert Denniver ReiningMVP, Moderator Donnerstag, 25. Januar 2018 00:20
-
Hallo,
ja, den Parameter habe ich als verpflichtend definiert, weil ich dachte, dass beim Senden an der Zielpfad einfach an den Befehl angefügt wird.
Wie komme ich an den Dateipfad der Datei, für die ich das Senden an ausgelöst habe?
Vielen Dank
Update-Troubleshooter
-
- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Dienstag, 23. Januar 2018 11:20
- Als Antwort markiert Denniver ReiningMVP, Moderator Donnerstag, 25. Januar 2018 00:20
-
Leider funktioniert auch das nicht.
Daher habe ich mir ein Testscript geschrieben:
[CmdletBinding()] Param ( [string]$Source, [string]$Destination ) Write-Host $PSBoundParameters Write-Host $args[0] Write-Host $Source Write-Host $Destination
Der Aufruf im Link lautet jetzt wie folgt:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -file c:\send.ps1 -Source "%1" -Destination "Production"
Ich erhalte dabei nun folgende Fehlermeldung:
C:\send.ps1 : A positional parameter cannot be found that accepts argument 'C:\Return.exe'. + CategoryInfo : InvalidArgument: (:) [send.ps1], ParentContainsE rrorRecordException + FullyQualifiedErrorId : PositionalParameterNotFound,send.ps1
Ich bin ratlos. Was kann ich noch tun?
-
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -file c:\send.ps1 -Source "%1" -Destination "Production"
Mea Culpa - habe das mit Dateitypen/Verknüpfungen verwechselt... Für SendTo geht es tatsächlich automatisch:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -file c:\send.ps1 -Destination "Production" -Source
Zumindest bei mir :)