none
Erstellung benutzerdefinierter SendTo-Links mit PowerShell RRS feed

  • 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

    Donnerstag, 18. Januar 2018 08:54

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



    Donnerstag, 18. Januar 2018 09:31
  • > ja, den Parameter habe ich als verpflichtend definiert, weil ich dachte, dass beim Senden an der Zielpfad einfach an den Befehl angefügt wird.

    Ja, wird er. Aber Du mußt ihn auch entgegen nehmen: "%*" oder "%1" ist der Wert für -sourcefile. Mit "" wegen evtl. enthaltener Leerzeichen.

    Freitag, 19. Januar 2018 11:35

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



    Donnerstag, 18. Januar 2018 09:31
  • 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

    Donnerstag, 18. Januar 2018 10:04
  • > ja, den Parameter habe ich als verpflichtend definiert, weil ich dachte, dass beim Senden an der Zielpfad einfach an den Befehl angefügt wird.

    Ja, wird er. Aber Du mußt ihn auch entgegen nehmen: "%*" oder "%1" ist der Wert für -sourcefile. Mit "" wegen evtl. enthaltener Leerzeichen.

    Freitag, 19. Januar 2018 11:35
  • 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?
    

    Donnerstag, 25. Januar 2018 09:57
  • 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 :)

    Donnerstag, 25. Januar 2018 12:48