La concatenazione di stringhe Powershell mette le stringhe a caso


0

Sto affrontando un comportamento molto strano con la mia sceneggiatura Powershell. Ricevo valori da un documento pdf tramite Word come ComObject. Ottenere i valori funziona bene e non è un problema, ma non appena provo a concatenare due variabili che ho ottenuto dal documento, dopo averle concatenate manca una di esse. Inizialmente sospettavo fosse un problema con il carattere di sottolineatura, ma dopo aver provato ogni possibile forma di escape, come `_ o $ {variabile} _ e persino averlo sostituito con altri caratteri come uno spazio, ho ancora lo stesso problema .

Posso visualizzare le variabili da solo e restituiscono il valore giusto, ma dopo la concatenazione ottengo un comportamento molto strano.

$filepath = "C:\Users\xxxx\Desktop\all_spools\" $wd = New-Object -ComObject Word.Application $wd.Visible = $false $files = Get-ChildItem -path $filepath foreach($file in $files) { $doc = $wd.Documents.Open($file.FullName) if ($doc.tables(1).rows.count -eq 7) { $docnum = $doc.tables(1).Columns(2).cells(2).Range.Text $intdocarr = $doc.tables(1).Columns(2).cells(7).Range.Text $intdocnum = $intdocarr.split(" ") $finalintdocnum = $intdocnum | Select-Object -first 1 $doc.Close() } else { $docnum = $doc.tables(1).Columns(2).cells(2).Range.Text $intdocarr = $doc.tables(1).Columns(2).cells(8).Range.Text $intdocnum = $intdocarr.split(" ") $finalintdocnum = $intdocnum | Select-Object -first 1 $doc.Close() } $filename = "${docnum}_$finalintdocnum.pdf" $filename } $wd.Quit()

Il mio output previsto sarebbe simile a "90004234_74503423.pdf", ma in realtà ottengo "_74503424.pdf". A volte a caso diventa "_74503423.pdf90004234", che non è riproducibile. Sono un po 'perso.

Quando la variabile $ docnum viene utilizzata per rinominare il file, ricevo un errore con i caratteri illegali nel percorso, ho anche provato a rimuovere tutto e a riproporre solo i numeri.

La mia domanda è: mi sto perdendo qualcosa? Non riesco a capire perché questo non funzionerebbe.


Probabilmente $doc.tables(1).Columns(2).cells(2).Range.Textcontiene spazzatura.
Lieven Keersmaekers,

Userei $finalintdocnum = $intdocarr.Split(" ")[0]ma altrimenti senza i tuoi dati è difficile aiutarti.
LotPings,

Risposte:


1

Se si reindirizza $doc.tables(1).Columns(2).cells(2).Range.Texta clipe incollare in un editor di testo più rivelatrice (sto usando Notepad ++), vedrai che un carattere ASCII viene catturato che non ti aspetti.

inserisci qui la descrizione dell'immagine

È possibile modificare la dichiarazione di $docnumper escludere questi personaggi , sia nella vostra ife else.

$docnum = ($doc.tables(1).Columns(2).cells(2).Range.Text) -replace "[\x00-\x1F]+"

Inoltre, dovresti impostare in $filenamequesto modo. Per come lo hai, il carattere di sottolineatura viene trattato come parte del nome della variabile.

$filename = "$docnum" + "_" + "$finalintdocnum.pdf"

1
Grazie, era quello che sospettavo anche io, il trucco con la clip è molto utile. Mi hai davvero aiutato
huhnmonster il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.