woody72
Goto Top

Powershell function: get-clipboard cmdlet in einer function wird nicht ausgeführt

Hallo,

ich habe eine Funktion geschrieben, die Dateien von einer Webseite (legal face-wink) herunterlädt und in einem Verzeichnis speichert. Dazu holt sie sich über das cmdlet Get-Clipboard die entsprechenden ISBN aus der Zwischenablage.
Wenn ich die Funktion direkt aufrufe, holt sie sich die ISBN und lädt damit die Dateien vom Server herunter.
Rufe ich die Funktion allerdings aus einer weiteren Funktion heraus auf, werden keine Dateien heruntergeladen, weil Get-Clipboard nicht funktioniert. Was mache ich falsch?

Hier der Code der Funktion (geschrieben für eine GUI):
function ISBNfromClip {
	$isbns = (Get-Clipboard).Split("'n|,") -replace '(^\s+|-|ISBN)',''   
	$script:ISBN = $isbns -match '\d'  
	$ISBN
	$AnzISBN = $ISBN.count
	$meldung = "$AnzISBN ISBN übernommen."  
	$LW = IF ($env:computername -ne "[NAME]" ) { 'Z:' } ELSE { 'D:\Datentausch' }  
	$LW
	IF ( $ISBN -match '[0-9]{13}' ) { $LabeleMail.Text = $meldung+$LW   
			$client = new-object System.Net.WebClient
			$dnb_url = "https://services.dnb.de/sru/accessToken~494b29337218a51c9b74985da0788e/dnb?version=1.1&operation=searchRetrieve&query=num%3D"  
#Das Access-Token spielt keine Rolle mehr, alle Datensätze der dnb stehen unter CC0 1.0 zur Verfügung.
			$record_schema = "&recordSchema=MARC21-xml"  
			foreach ($i in $ISBN) {
				$client.DownloadFile("$dnb_url+$i+$record_schema","$LW\dnb\$i.xml")  
			}
	}
	  else { $label.Text = "Die Zwischenablage enthält keine ISBN!"  
			 $ImportButtonDNB.BackColor = 'red'  
			 $ImportButtonDNB.Text = „Abbrechen“
			 $ImportButtonDNB.DialogResult = „Cancel“
	}
}

Wie gesagt, stand alone funktioniert der Code. Wenn ich ihn aber über die folgende Funktion aufrufe, damit in der GUI eine Progressbar sichtbar wird, verweigert Get-Clipboard seinen Dienst:
function DNBImportClip( $x, $t ) {
    $ProgressBar = New-Object System.Windows.Forms.ProgressBar
    $ProgressBar.Location = New-Object System.Drawing.Point(30, 290)
    $ProgressBar.Size = New-Object System.Drawing.Size(300, 30)
    $ProgressBar.Style = "Marquee"  
    $ProgressBar.MarqueeAnimationSpeed = 20

    $child_form.Controls.Add($ProgressBar);

    $Label.Font = $procFont
    $Label.ForeColor = 'red'  
    $Label.Text = "Download ..."  
    $ProgressBar.visible

   #Ich lasse die datenbankspezifischen Parameter aus, weiter geht es mit dem Aufruf der Funktion ISBNfromClip:

        $functioncontent = (Get-Item function:ISBNfromClip).definition 
	$scriptblock = [scriptblock]::Create("function ISBNfromClip {$functioncontent}")  
	$job1 = start-job -InitializationScript $scriptblock -scriptblock { ISBNfromClip } 
	do { [System.Windows.Forms.Application]::DoEvents() } until ($job1.State -eq "Completed")  
	$Label.Text = "Erledigt:"  
	$LabelQueryOut.Text = "Download abgeschlossen"  
	Remove-Job -Job $job1 -Force
	
	$LabelQueryOut.Text = ""  
	$Label.Text = "Moment bitte. Die Daten werden importiert."  
	$job2 = start-job -scriptblock $block -InputObject $sqlquery -argumentlist 'Benutzername/Passwort@TNS_Alias'   
	do { [System.Windows.Forms.Application]::DoEvents() } until ($job2.State -eq "Completed")  
	$string = Receive-Job -Job $job2 
        [...]

Das seltsame ist, dass der Funktionsaufruf über functioncontent und scriptblock in einem anderen Fall (mit dem cmdlet Get-Content) funktioniert:
function DNBDownList {
			$LW = IF ($env:computername -ne "[NAME]" ) { 'Z:' } ELSE { 'D:\Datentausch' }  
			$LW
			$client = new-object System.Net.WebClient
			$dnb_url = "https://services.dnb.de/sru/accessToken~494b29337218a51c9b74985da0788e/dnb?version=1.1&operation=searchRetrieve&query=num%3D"  
			$record_schema = "&recordSchema=MARC21-xml"  
			$isbns = Get-Content "$LW\dnb\ISBN.txt"  
			foreach ($i in $isbns) {
				$client.DownloadFile("$dnb_url+$i+$record_schema","$LW\dnb\$i.xml")  
			}
}

Der functioncontent-Block:
$functioncontent = (Get-Item function:DNBDownList).definition 
	$scriptblock = [scriptblock]::Create("function DNBDownList {$functioncontent}")  
	$job1 = start-job -InitializationScript $scriptblock -scriptblock { DNBDownlist } 
	do { [System.Windows.Forms.Application]::DoEvents() } until ($job1.State -eq "Completed")  
	$Label.Text = "Erledigt:"  
	$LabelQueryOut.Text = "Download abgeschlossen"  
	Remove-Job -Job $job1 -Force

Habt Ihr damit alles, um mir auf die Sprünge helfen zu können? Meist sitzt das Problem ja vor dem Bildschirm ...

Viele Grüße
Christoph

Content-Key: 7751528077

Url: https://administrator.de/contentid/7751528077

Printed on: May 3, 2024 at 08:05 o'clock