Concatenação de Cadeia Powershell coloca strings aleatoriamente

0

Estou enfrentando um comportamento muito estranho com o meu roteiro Powershell. Eu estou recebendo valores de um documento pdf via Word como um ComObject. Obtendo os valores funciona bem e não é problema, mas assim que eu tento concatenar duas variáveis que recebi do documento, depois de concatená-las uma delas está faltando. No começo eu suspeitei que era um problema com o sublinhado, mas depois de experimentar todas as formas possíveis de escape, como '_ ou $ {variable} _ e até substituí-lo por outros caracteres como um espaço, eu ainda tenho o mesmo problema .

Eu posso mostrar as variáveis sozinhas e elas retornam o valor correto, mas depois da concatenação eu tenho um comportamento muito estranho.

$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()

Meu resultado esperado seria algo como "90004234_74503423.pdf", mas de fato recebo "_74503424.pdf". Às vezes, ao acaso, torna-se "_74503423.pdf90004234", que não é reproduzível. Eu estou meio que perdido.

Quando a variável $ docnum é usada para renomear o arquivo, recebo um erro com caracteres ilegais no caminho, eu também tentei remover tudo e extrair apenas números.

Minha pergunta é, estou faltando alguma coisa? Não consigo entender por que isso não funcionaria.

    
por huhnmonster 23.08.2018 / 13:15

1 resposta

1

Se você canalizar $doc.tables(1).Columns(2).cells(2).Range.Text para clip e colar em um editor de texto mais revelador (estou usando o Notepad ++), verá que um caractere ascii é capturado e não está esperando.

Vocêpodealteraradeclaraçãode$docnumpor excluindo esses caracteres , tanto no seu if quanto no else .

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

Além disso, você deve definir $filename desta forma. Do jeito que você tem, o sublinhado é tratado como parte do nome da variável.

$filename = "$docnum" + "_" + "$finalintdocnum.pdf"
    
por 23.08.2018 / 15:18