[Решено-inAway] Powershell - Как использовать переменную текста вместо MailPublicFolderIdParameter - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь использовать строку текста из файла "* .txt" в качестве "MailPublicFolderIdParameter" в powershell вместо необходимости вводить ее вручную.

Первоначальная проблема заключается в том, что текст = DISTRIKT \ 66 \ BKS-TEST и отсутствует обратная ссылка sh, чтобы он работал в качестве пути для MailPublicFolderIdParameter с помощью команды "Get-MailPublicFolder"

Я попытался создать переменную ($PFNameString) и соединить ее с другой переменной ($slash = [char]0x005C)

Мне удалось объединить эти две текстовые строки / переменные вместе с

$joinedvariables = -join($slash,$PFNameString) 

И вывод становится \ DISTRIKT \ 66 \ BKS-TEST

Теперь, обычно, если я ввожу команду непосредственно в powershell, она работает так, как я хочу:

Get-MailPublicFolder -Identity \DISTRIKT\66\BKS-TEST

Alias            Identity                                                       
-----            --------                                                   
BKS-TEST             master.net/Microsoft Exchange System Objects/BKS-TEST  

Если я попробуйте вызвать "MailPublicFolderIdParameter", используя вместо этого созданную мною переменную, которая является просто той же текстовой строкой \ DISTRIKT \ 66 \ BKS-TEST. Ошибка не будет.

Мой скрипт:

$PFNameString = [IO.File]
::ReadAllText("H:\Temp\PublicFolder-powershell\PFName-Fetch.txt")
$slash = [char]0x005C
$joinedvariables = -join($slash,$PFNameString)
Get-MailPublicFolder -Identity $joinedvariables 

Результат:

Я получаю сообщение об ошибке

PS

 C:\Windows\System32\WindowsPowerShell\v1.0> $PFNameString = [IO.File]::ReadAllText("H:\Temp\PublicFolder-powershell\PFName-Fetch.txt")
$slash = [char]0x005C $joinedvariables = -join($slash,$PFNameString)
Get-MailPublicFolder -Identity $joinedvariables
The operation couldn't be performed because object '\DISTRIKT\66\BKS-TEST 
' couldn't be found on 'SERVERNAME' 

Я пытался использовать $arr = $joinedvariables для преобразования переменной в массив, и при печати результат идентичен тому, что я набрал бы вручную. \ DISTRIKT \ 66 \ BKS-TEST, но он все еще не работает для вызова массива вместо переменной.

Как я могу использовать результат $joinedvariables для замены ручного ввода "MailPublicFolderIdParameter" текст? Как просто «вставить его как текст, как если бы он был написан напрямую»?

Моя конечная цель - извлечь primarysmtpaddress из папки publi c и сохранить ее в переменной для дальнейшего использования.

Файл txt должен быть источником, поскольку он генерируется макросом Excel, и будет меняться в зависимости от того, какая папка Publi c экспортирована в текстовый файл как текст.


РЕДАКТИРОВАТЬ: Кажется, я нашел причину. Когда я запускаю сценарий, получая текст из файла, соединяясь с переменной $ sla sh и выписывая его, я обнаруживаю две вещи по умолчанию:

#Takes Content of "PFName-Fetch.txt" and adds a $slash with to the front of textline and saves it to PFName-TOMAILREPLACE.txt
$PFNameString = Get-Content -First 1 -Path H:\Temp\PublicFolder-powershell\PFName-Fetch.txt
$slash = [char]0x005C
$joinedvariables = -join($slash,$PFNameString,' ') | Set-Content -Path H:\Temp\PublicFolder-powershell\PFName-TOMAILREPLACE.txt -Force
  1. Вывод файл при использовании Set-Content всегда имеет кодировку "UCS-2 BE BOM".

Поэтому я немного изменил скрипт, чтобы перекодировать его в том же процессе в UTF8NoBoom, который необходим, так как я обнаружил, что я не могу разобрать текст из документов как -IDENTITY, если он не в этом формате. Это было основной причиной вышеуказанной ошибки.

#Converts file to UTF-8 NO BOOM Since it otherwise will not work as -IDENTITY parameter.

$MyPath = "H:\Temp\PublicFolder-powershell\PFName-Fetch.txt" # read the file in
$MyFile = Get-Content $MyPath
$slash = [char]0x005C
$joinedvariables = -join($slash,$MyFile,"")
$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False
$MyPathOut = "H:\Temp\PublicFolder-powershell\PFName-TOMAILREPLACE.txt" # export it here without BOM
[System.IO.File]::WriteAllLines($MyPathOut, $joinedvariables, $Utf8NoBomEncoding)
Вторая проблема, с которой я сейчас сталкиваюсь, это та, с которой я действительно не могу разобраться.

Set-Content и [System.IO.File] :: WriteAllLines одновременно записывают файлы с «возвратом каретки» в конце предложений, и этот одиночный возврат каретки не позволяет мне получить информация из файла и ее анализ в качестве строки -IDENTITY, которая будет использоваться.

Я попытался несколько версий сценариев для изменения TXT-файла впоследствии, как в Visual Basi c, так и в Powershell, и я просто не могу избавиться от "новой строки", добавленной в файлы.

РЕДАКТИРОВАТЬ:

Нашел пакетный скрипт, который сделал то, что мне нужно:

@echo off
setlocal enableExtensions disableDelayedExpansion

set "inputFile=H:\Temp\PublicFolder-powershell\PFName-TOMAILREPLACE.txt"
set "outputFile=H:\Temp\PublicFolder-powershell\PFName-TOMAILREPLACE2.txt"

:: test if file ends with a '\n' (true only if an additional "\r\n" will add no new line)
for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "%inputFile%"') do set "n=%%a"
for /F "tokens=1* delims=:" %%a in ('^(type "%inputFile%" ^& echo^(^) ^| findstr /N "^" ') do set "m=%%a"
set /A "d=m-n"

:: 'copy' file
(
   set "line="
   if "%d%" == "1" for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "%inputFile%"') do (
      if not "%%~a" == "%n%" (
         echo(%%b
      ) else (
         set line=%%b
         setlocal enableDelayedExpansion
         <nul set /P "=!line!"
         endlocal
      )
   ) else (
      type "%inputFile%"
   )
) > "%outputFile%"
del "H:\Temp\PublicFolder-powershell\PFName-TOMAILREPLACE.txt"
ren H:\Temp\PublicFolder-powershell\PFName-TOMAILREPLACE2.txt PFName-TOMAILREPLACE.txt
endlocal
goto :eof

Теперь я могу импортировать строку -IDENTITY с помощью txt-файла и извлечь основной smtp адрес:

$PFNameMAIL = Get-Content -Path H:\Temp\PublicFolder-powershell\PFName-TOMAILREPLACE.txt -Raw
Get-MailPublicFolder -Identity $PFNameMAIL | ft primarysmtpaddress

РЕЗУЛЬТАТ:

    $PFNameMAIL = Get-Content -Path H:\Temp\PublicFolder-powershell\PFName-TOMAILREPLACE.txt -Raw
    Get-MailPublicFolder -Identity $PFNameMAIL | ft primarysmtpaddress

    PrimarySmtpAddress  
    ------------------
    BKS-TEST@server.com


.

Так что ... идет, чтобы показать .. никогда не сдавайся!

Позволить всем стоять здесь, чтобы люди

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...