Я пытаюсь получить список общих ресурсов 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()
в разных местах, но безрезультатно. Кто-нибудь поможет мне понять, как заставить это работать?
Спасибо!
Get-Log: набор параметров не может быть разрешен с использованием указанных именованных параметров. At C:\ErrorLogs.ps1:72 char:17 + write-host $@(log)[0] + ~~~ + CategoryInfo: InvalidArgument: (:) [Get-Log], ParameterBindingException + FullyQualifiedErrorId: AmbiguousParameterSet, VMware. VimAutomation.ViCore.Cmdlets.Commands.GetLog
Обновлять:
Ваша проблема сводилась к неправильному представлению о том, что @(...)
, оператор подвыражения массива является конструктором массива, которым он не является: вместо этого думайте о нем как о гаранте массива.
Таким образом, замените:
$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
(примечание: вместо сопоставления строк используются шаблоны регулярных выражений).
Вероятно, неплохо было бы выделить такой код взаимодействия в отдельную функцию/модуль.
что
$@(log)[0]
дает вам