Я пытаюсь использовать строку текста из файла "* .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
- Вывод файл при использовании 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
.
Так что ... идет, чтобы показать .. никогда не сдавайся!
Позволить всем стоять здесь, чтобы люди