Powershell не смог найти часть пути

Был на этом несколько часов. Я пытаюсь получить список программного обеспечения с компьютера с Windows и экспортировать этот список в виде CSV, используя местоположение как $ env: userprofile и путь к файлу «Software Inventories \ $ Username.csv»

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

Export-Csv : Could not find a part of the path 'C:\Users\mylogin\Software Inventories\@{UserName=domain\mylogin}.csv'.
At C:\Users\mylogin\Dropbox\Powershell\GetSoftwareList.ps1:24 char:191
+ ... e, Vendor, Version | Sort-Object DisplayName | Export-Csv -Path $Path
+                                                    ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OpenError: (:) [Export-Csv], DirectoryNotFoundException
    + FullyQualifiedErrorId : FileOpenFailure,Microsoft.PowerShell.Commands.ExportCsvCommand

А код такой:

$ComputerName = Read-Host 'Enter IP or computer name'
$WindowsVersion = Get-WmiObject -ComputerName $ComputerName -Credential 'domain\myadmin' -Class Win32_OperatingSystem | ForEach-Object -MemberName Caption


If ($WindowsVersion -match 'Microsoft Windows 10 Enterprise'){

    $Username = Get-CimInstance -ComputerName $ComputerName -ClassName Win32_ComputerSystem | Select-Object UserName
    $Path = Join-Path $env:userprofile "Software Inventories\$Username.csv"
    Get-CimInstance -ComputerName $ComputerName -Credential "domain\myadmin" -ClassName Win32_InstalledWin32Program | Select Name, Vendor, Version | Sort-Object Name | Export-Csv -Path $Path
    Write-Host "Windows version is $WindowsVersion"

}Elseif ($WindowsVersion -match 'Microsoft Windows 7 Enterprise') {

    $Username = Get-WmiObject -ComputerName $ComputerName -Class Win32_ComputerSystem | Select-Object UserName
    $Path = Join-Path $env:userprofile "Software Inventories\$Username.csv"
    Get-WmiObject -ComputerName $ComputerName -Credential 'domain\myadmin' -Class Win32Reg_AddRemovePrograms | Select DisplayName, Vendor, Version | Sort-Object DisplayName | Export-Csv -Path $Path
    Write-Host "Windows version is $WindowsVersion"

Я неправильно использую Join-Path?

Кстати, как я могу получить только имя пользователя в виде строки из $ Username и пропустить остальное?

Чтобы разделить имя пользователя, используйте эту строку $ Username = (Get-CimInstance -ComputerName $ ComputerName -ClassName Win32_ComputerSystem | Select-Object UserName) .UserName.Split ("\") [1]

Frédéric Bonneau 13.09.2018 19:35
0
1
4 258
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Переменная $ UserName - это хеш-таблица со свойством UserName и значением domain \ mylogin. Чтобы выбрать только значение свойства, используйте параметр ExpandProperty из Select-Object.

$Username = Get-CimInstance -ComputerName $ComputerName -ClassName Win32_ComputerSystem | Select-Object -ExpandProperty UserName

Большое спасибо за объяснение переменной $ Username :)

Fexception 13.09.2018 19:59
Ответ принят как подходящий
$Username = (Get-CimInstance -ComputerName $ComputerName -ClassName Win32_ComputerSystem | Select-Object -ExpandProperty UserName).Split('\')[1]
$Username = (Get-WmiObject -ComputerName $ComputerName -Class Win32_ComputerSystem | Select-Object -ExpandProperty UserName).Split('\')[1]

Спасибо! Это сработало. Я так понимаю. Разделитель \ опускает все до него и сохраняет только то, что идет после него.

Fexception 13.09.2018 20:01

Какую функцию выполняет "[1]" в этой строке?

Fexception 13.09.2018 20:03

Свойство UserName вернет строку в формате «[Домен] \ [Имя пользователя]». С разделенным .Split('\') мы можем делать именно то, что он говорит, и разделять строку на две части, используя '\' (обратную косую черту) в качестве разделителя. Результатом является нулевой индексированный массив из двух строк. Первый элемент - это домен с индексом 0 в массиве "domain\user".Split('\')[0], второй - это имя пользователя, которое имеет следующий номер индекса в массиве, который равен 1 "domain\user".Split('\')[1].

Nas 13.09.2018 21:23

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