Массив символов вместо массива строк

Я пытаюсь получить список общих ресурсов SMB на удаленном файловом сервере. К сожалению, из-за типа сервера, который я запрашиваю, WMI и CIM не будут работать. Единственное, что я могу заставить работать, это net view (который, я думаю, использует netbios).

Я запускаю следующий код, который получает акции:

$shares = net view \\server1 /all | select -Skip 7 | ?{$_ -match 'disk*'} | %{$_ -match '^(.+?)\s+Disk*'|out-null;"\\server1\$($matches[1])"}
$shares += net view \\server2 /all | select -Skip 7 | ?{$_ -match 'disk*'} | %{$_ -match '^(.+?)\s+Disk*'|out-null;"\\server2\$($matches[1])"}


foreach ($share in $shares) {
    $logdir1 = @("$share\App_Data\","errorlogs")
    $logdirs = @($logdir1)

    foreach ($log in $logdirs) {
        write-host $log[0]

Однако вместо получения списка путей я получаю первый символ каждого пути. Так что в основном $log[0] - это символ, а не строка, как я ожидал.

Я думаю, это связано с тем, что команда net view возвращает символы вместо объекта.

Я пытался использовать ToString() в разных местах, но безрезультатно. Кто-нибудь поможет мне понять, как заставить это работать?

Спасибо!

что $@(log)[0] дает вам

Metzli_Tonaltzintli 24.11.2022 22:22

Get-Log: набор параметров не может быть разрешен с использованием указанных именованных параметров. At C:\ErrorLogs.ps1:72 char:17 + write-host $@(log)[0] + ~~~ + CategoryInfo: InvalidArgument: (:) [Get-Log], ParameterBindingException + FullyQualifiedErrorId: AmbiguousParameterSet, VMware. VimAutomation.ViCore.Cmdlets.Co‌​mmands.GetLog

Brad 24.11.2022 22:57
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
2
2
100
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Обновлять:

Ваша проблема сводилась к неправильному представлению о том, что @(...), оператор подвыражения массива является конструктором массива, которым он не является: вместо этого думайте о нем как о гаранте массива.

Таким образом, замените:

$logdirs = @($logdir1) # WRONG: same as $logDirs = $logdir1 in this case.

с:

$logdirs = , $logdir1

... чтобы создать вложенный массив, единственным элементом которого является двухэлементный массив, содержащийся в $logDir, используя , оператор конструктора массива , который затем можно перечислить с помощью foreach и ссылаться на его элементы с помощью [0] и [1].

Для получения дополнительной информации о @(...) см. этот ответ.


Оригинальный ответ:

$logdir1 = @("$share\App_Data\","errorlogs")
$logdirs = @($logdir1)

... можно сократить до $logdirs = @("$share\App_Data\", "errorlogs")

    foreach ($log in $logdirs) {

... затем перечисляет элементы массива строковых значений в $logDirs

    write-host $log[0]

... затем ссылается на первый символ ([0]) имеющегося строкового значения (индексация в строку извлекает символ в указанной позиции, например, 'abc'[1] дает 'b')

Поэтому все работает так, как ожидалось.

Возможно, вы хотели перечислить файлы внутри каталога, на который ссылается каждое значение $log (переименованное в $logDir для ясности ниже)?

foreach ($logdir in $logdirs) {
  $filesInDir = Get-ChildItem -File -LiteralPath $logdir
  $filesInDir[0]
}

Внешние инструменты всегда возвращают string[], где каждая строка вывода является элементом выходного массива.

Сначала вам нужно проанализировать эти строки для использования с Powershell, если, конечно, достаточно «строки вывода» (как в DIR / B выводе из cmd). Здесь может помочь оператор -replace (примечание: вместо сопоставления строк используются шаблоны регулярных выражений).

Вероятно, неплохо было бы выделить такой код взаимодействия в отдельную функцию/модуль.

Другие вопросы по теме