Список команд или зависимостей модулей в файле сценария .ps1

Есть ли способ определить все командлеты, используемые в файле сценария? Я пытаюсь найти требования для развертывания в другой среде. Какие модули были использованы? Какая версия установлена? Затем вы можете просмотреть список команд и узнать, что установить в новой среде.

В качестве примера воспользуемся файлом ниже. Как только я узнаю командлеты, я могу использовать get-command, чтобы узнать установленный модуль / версию. Ссылка: Найдите командлеты PowerShell с помощью Get-Command | 4sysops

Спасибо за совет.

Зависимости командлета (пример вывода)

Cmdlets used in 'C:\myDir\---\PbiList_Reports_exportCsv.ps1'   
------

Get-AzStorageAccountKey
New-AzStorageContext 
Start-Transcript 
Write-Host 
New-Object 
Connect-PowerBIServiceAccount 
etc...

Информация о командлете (пример вывода)

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          Get-AzStorageAccountKey                            3.6.0      Az.Storage
Cmdlet          Connect-PowerBIServiceAccount                      1.0.974    MicrosoftPowerBIMgmt.Profile
etc...

PbiList_Reports_exportCsv.ps1 (исходный вход)

<#------------------------------------------------------
# 4,REPORT: Export list of all workspace reports 
# 
# Loop all workspaces. Retreive reports list. Export to blob storage.
# --> Account > Container > Blob
#------------------------------------------------------#>

# -------- Export files local dir --------
$Filepath = "C:\Users\me\Dropbox\00-PBI\ActivityLogs\"
$Transcript_file = $Filepath +"Logs\testlog_reports.txt"
$Reports_file = $Filepath +"AllReports.csv"
### $wsReportsAll | Export-csv -Path $Reports_file -NoTypeInformation
#

# -------- Export files to Azure blob --------
$Transcript_file = "testfun_reports.txt"
$Reports_file = "AllReports.csv"

# Get key to storage account
# Map to the reports BLOB context
# Copy the file to the storage account
$acctKey = (Get-AzStorageAccountKey -Name "myblob" -ResourceGroupName "myResource").Value[0] 
$storageContext = New-AzStorageContext -StorageAccountName "myblob" -StorageAccountKey $acctKey -Verbose


#### Print write-host to log file
Start-Transcript -Path "$Env:temp/$Transcript_file" -verbose # "C:\Users\me\Dropbox\00-PBI\ActivityLogs\Logs\testlog_reports.txt"
Write-Host "Today: ($Date).ToString("yyyy.MM.dd")" 


# -------- PBI Connection --------

Write-Host " PBI credentials ..." -ForegroundColor Yellow -BackgroundColor DarkGreen
## PBI credentials 
$password = "******" | ConvertTo-SecureString -asPlainText -Force
$username = "[email protected]" 
$credential = New-Object System.Management.Automation.PSCredential($username, $password)
Connect-PowerBIServiceAccount -Credential $credential


#-------- PBI Workspace Reports  -------
$wsReportsAll = @()

# Workspaces filtered to exclude PBI Personal and other PBI Groups
Write-Host " Workspace info ..." -ForegroundColor Yellow -BackgroundColor DarkGreen
$Groups = Get-PowerBIWorkspace -All -Scope Organization | SORT @{Expression="Type"; Descending=$True}, Name | 
    ?{
    ($_.Type -eq 'Workspace') `
    }

Write-Host(($Groups.count).ToString() + " workspace count")

foreach ($ws in $Groups) {
    # Variables
    $wsName = $ws.Name.ToString()
    $wsId = $ws.Id.ToString()
    
    # Workspaces
    $wsReports = Get-PowerBIReport -WorkspaceId $ws.Id
    $wsReports = $wsReports | SELECT *, @{Name = 'Workspace'; Expression = {$wsName}} , @{Name = 'WorkspaceId'; Expression = {$wsId}} 
    
    Write-Host("")
    Write-Host($ws.Name + "...")
    Write-Host(($wsReports.count).ToString() + " report count") -ForegroundColor Cyan -BackgroundColor DarkGreen

    $wsReportsAll += $wsReports
}

$wsReportsAll | SELECT Id, Name, WorkspaceId, Workspace, DatasetId  | ft -auto
$wsReportsCsv = ($wsReportsAll | ConvertTo-Csv -NoTypeInformation).ToString() 
$wsReportsAll | Export-csv "$Env:temp/$Reports_file"

# $wsReportsAll | Export-csv -Path $Reports_file -NoTypeInformation
Set-AzStorageBlobContent -File "$Env:temp/$Reports_file" -Container "myFolder" -BlobType "Block" -Context $storageContext -Force -Verbose

Stop-Transcript

Set-AzStorageBlobContent -File "$Env:temp/$Transcript_file" -Container "myFolder" -Blob "Logs/$Transcript_file" -BlobType "Block" -Context $storageContext -Force -Verbose

#****************
#****************

person SherlockSpreadsheets    schedule 13.05.2021    source источник


Ответы (1)


Сначала (необязательно) примените Invoke-ScriptAnalyzer из модуля ScriptAnalyzer, чтобы исправить незначительные несоответствия (в частности, примените PSAvoidUsingCmdletAliases правило).

Затем вы можете использовать Класс синтаксического анализатора, например следующее:

# Define input script
$inputScript = '.\tests\PbiList_Reports_exportCsv.ps1'

("-" * 25) + ' ScriptAnalyzer'
Import-Module -Name PSScriptAnalyzer
Invoke-ScriptAnalyzer -Path "$inputScript" -ExcludeRule PSAvoidUsingWriteHost -Fix

# Empty collection for errors
$Errors = [System.Management.Automation.Language.ParseError[]]@()
# Empty collection for errors
$Tokens = [System.Management.Automation.Language.Token[]]@()

$Parsed = [System.Management.Automation.Language.Parser]::ParseFile(
                $inputScript,
                [ref]$Tokens,
                [ref]$Errors)

("=" * 25) + " Errors"
if ($Errors.Count -gt 0 ) {
    Write-Warning "$($Errors.Count) Errors found"
}

("≡" * 25) + " Commands"
$Commands = $tokens |
    Where-Object TokenFlags -eq "CommandName" |
        Sort-Object -Property Value -Unique
$Commands | Select-Object -ExpandProperty Value
### I can't do the following not having installed all modules
### $Commands | ForEach-Object { Get-Command -Name $_.Value }

Вывод: \SO\67519696.ps1

------------------------- ScriptAnalyzer

RuleName                            Severity     ScriptName Line  Message
--------                            --------     ---------- ----  -------
PSAvoidUsingConvertToSecureStringWi Error        PbiList_Re 39    File
thPlainText                                      ports_expo       'PbiList_Reports_exportCsv.ps1'
                                                 rtCsv.ps1        uses ConvertTo-SecureString with
                                                                  plaintext. This will expose secure
                                                                  information. Encrypted standard
                                                                  strings should be used instead.
PSUseDeclaredVarsMoreThanAssignment Warning      PbiList_Re 74    The variable 'wsReportsCsv' is
s                                                ports_expo       assigned but never used.
                                                 rtCsv.ps1
========================= Errors
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡ Commands
Connect-PowerBIServiceAccount
ConvertTo-Csv
ConvertTo-SecureString
Export-csv
Format-Table
Get-AzStorageAccountKey
Get-PowerBIReport
Get-PowerBIWorkspace
New-AzStorageContext
New-Object
Select-Object
Set-AzStorageBlobContent
Sort-Object
Start-Transcript
Stop-Transcript
Where-Object
Write-Host
person JosefZ    schedule 13.05.2021
comment
Он отлично работает, и вы - бог послал. Как мне получить +10 больших пальцев вверх? Спасибо! - person SherlockSpreadsheets; 14.05.2021