Почему моя переменная ломается в Powershell? (Захватывает переменную из файла) - PullRequest
1 голос
/ 04 февраля 2020

ПЕРВЫЙ ПОЧТ В STACKOVERFLOW! Я никогда не задавал никаких вопросов до сих пор. Пожалуйста, не бей меня слишком сильно. Lol.

Я пытаюсь создать скрипт powershell, чтобы взять имя, введенное в файл конфигурации, и ввести его в скрипт. (Переименование компьютера)

Раньше это работало, клянусь ... как есть. Но недавно я переместил все свои файлы в другую тестовую систему, и теперь он показывает это ... как будто он не может читать или видеть что-либо.

Я попытался проверить это, проверяя, читается ли он / собирается с правой стороны. поместите так, чтобы я вставил хост записи, чтобы увидеть, что это было, он прочитал правильно.

Я поместил -TotalCount, чтобы захватить Вторую строку, это правильно - верно?

Почему это не удается? И что еще более глупо, так это то, что ЭТО ПРОСТО РАБОТАЕТ.

КОД:

$password =XXXXXXXX | ConvertTo-SecureString -asPlainText -Force 
$username = XXXXXXXX 
$credential = New-Object System.Management.Automation.PSCredential($username,$password) 
$compname = (Get-Content -path .\0CONFIGURATION.txt -TotalCount 2) 

Rename-Computer -NewName $compname -LocalCredential $credential -PassThru 

Write-Host $compname

ОШИБКА:

Rename-Computer : Cannot convert 'System.Object[]' to the type 'System.String' required by parameter 
'NewName'. Specified method is not supported.
At line:6 char:26
+ Rename-Computer -NewName $compname -LocalCredential $credential -Pass ...
+                          ~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Rename-Computer], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.RenameComputerCommand 

Снимок экрана моих неудач

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

Я положил -TotalCount 2, чтобы захватить Вторую строку, это правильно - верно?

Нет: -TotalCount (чьи псевдонимы -First и -Head ) указывает количество строк, которые нужно прочитать (начало) файла.

Если в вашем файле есть хотя бы 2 строки,

$compname = (Get-Content -path .\0CONFIGURATION.txt -TotalCount 2)

Поэтому

будет хранить массив из 2 элементов ([object[]]) в $compname, и, учитывая, что Rename-Computer (разумно) принимает только одиночное имя компьютера через его параметр -NewName, вы получите сообщение об ошибке, которое вы видели.


Получение одной строки из файла:

Для smalli sh Для файлов самый простой, но несколько расточительный подход состоит в том, чтобы Get-Content прочитать все строк ввода в массив и затем просто индексировать в этот массив (подход Sid ):

# Line with (0-based) index *1* is the *2nd line.
# Note: Convenient, but reads the entire file first.
$compname = (Get-Content -path .\0CONFIGURATION.txt)[1]

A более эффективный, но все еще потенциально расточительный подход , который также является самым быстрым вариантом в этом случай (короткий t вызова. NET методов напрямую):

# Collect only the first 2 lines in an array, then
# use [-1] to grab the *last* line from that array, which is by 
# definition the 2nd one.
$compname = (Get-Content -path .\CONFIGURATION.txt -First 2)[-1]

самый экономичный, но самый медленный подход заключается в передаче по каналу Select-Object и использовании параметр (0)
-Index:

# Selects (outputs) only the line with index 1, i.e. the 2nd line.
# This is most memory-efficient, because by using the pipeline 
# the lines preceding the line of interest merely *stream* 
# (are processed one by one), without the need to first *collect them in an array*.
$compname = Get-Content -path .\CONFIGURATION.txt | Select-Object -Index 1

Получение нескольких строк из файла - по диапазону и / или отдельные индексы:

Обратите внимание, что -Index опционально поддерживает массив индексов для поддержки , возвращая несколько строк , используя .. оператор диапазона (чисел / символов) в этом примере:

$lines2and3 = Get-Content -path .\CONFIGURATION.txt | Select-Object -Index (1..2)

оператор индекса PowerShell, [...], обеспечивает такую ​​же гибкость :

$lines2and3 = (Get-Content -path .\CONFIGURATION.txt)[1..2]

Вы можете даже объединить несколько диапазонов и отдельные индексы, используя выражения для указания индексов:

# Get line 2, as well as lines 4 - 6.
# Note the need for unary `,` if the expression starts with a *single* index.
# You wouldn't need that if the expression starts with an array; e.g.:
#    `3..5 + 1` or `3, 4, 5 + 1`
Get-Content -path .\CONFIGURATION.txt | Select-Object -Index (, 1 + 3..5)

# Ditto.
(Get-Content -path .\CONFIGURATION.txt)[, 1 + 3..5]
0 голосов
/ 04 февраля 2020

ОТВЕТЬТЕ СПАСИБО (SID работает) СПАСИБО !!!!!!! Могу сказать, насколько я мокрый за ушами.

$password =XXXXXXXX | ConvertTo-SecureString -asPlainText -Force 
$username = XXXXXXXX 
$credential = New-Object System.Management.Automation.PSCredential($username,$password) 
$compname = (Get-Content -path .\0CONFIGURATION.txt)[1]

Rename-Computer -NewName $compname -LocalCredential $credential -PassThru 

Write-Host $compname
...