Skip to content

Cannot determine line endings as the text probably contain mixed line endings. #2074

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Open
andrecrms opened this issue Mar 5, 2025 · 1 comment

Comments

@andrecrms
Copy link

Before submitting a bug report:

  • Make sure you are able to repro it on the latest released version
  • Perform a quick search for existing issues to check if this bug has already been reported

Steps to reproduce

$scriptContent = Get-Content -Path "C:\temp\myscript_posh_v2.ps1" -Raw
Invoke-Formatter -ScriptDefinition $scriptContent | Set-Content -Path "C:\temp\myscript_posh_v2.ps1"
$error[0] | select *

Expected behavior


Actual behavior

PSMessageDetails :
Exception : System.ArgumentException: Cannot determine line endings as the text probably contain mixed line endings.
Parameter name: text
at Microsoft.Windows.PowerShell.ScriptAnalyzer.EditableText.GetNumNewLineCharacters(String text, String[]& lines)
at Microsoft.Windows.PowerShell.ScriptAnalyzer.EditableText.GetNewLineCharacters(String text, String[]& lines)
at Microsoft.Windows.PowerShell.ScriptAnalyzer.EditableText..ctor(String text)
at Microsoft.Windows.PowerShell.ScriptAnalyzer.Formatter.Format[TCmdlet](String scriptDefinition, Settings settings, Range range, TCmdlet cmdlet)
at Microsoft.Windows.PowerShell.ScriptAnalyzer.Commands.InvokeFormatterCommand.ProcessRecord()
at System.Management.Automation.CommandProcessor.ProcessRecord()
TargetObject :
CategoryInfo : NotSpecified: (:) [Invoke-Formatter], ArgumentException
FullyQualifiedErrorId : System.ArgumentException,Microsoft.Windows.PowerShell.ScriptAnalyzer.Commands.InvokeFormatterCommand
ErrorDetails :
InvocationInfo : System.Management.Automation.InvocationInfo
ScriptStackTrace : at , : line 2
PipelineIterationInfo : {}

If an unexpected error was thrown then please report the full error details using e.g. $error[0] | Select-Object *

Environment data

> $PSVersionTable

Name                           Value                                                                                                                                                                        
----                           -----                                                                                                                                                                        
PSVersion                      5.1.26100.1882                                                                                                                                                               
PSEdition                      Desktop                                                                                                                                                                      
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}                                                                                                                                                      
BuildVersion                   10.0.26100.1882                                                                                                                                                              
CLRVersion                     4.0.30319.42000                                                                                                                                                              
WSManStackVersion              3.0                                                                                                                                                                          
PSRemotingProtocolVersion      2.3                                                                                                                                                                          
SerializationVersion           1.1.0.1       

> (Get-Module -ListAvailable PSScriptAnalyzer).Version | ForEach-Object { $_.ToString() }
1.23.0
@andrecrms
Copy link
Author

Full script:

$VMs = @("server1", "server2")
$Connection = @()
$Jobs = @()
$LogFile = "$(Get-Location)\execution_log.txt"

Function to log messages to a file

function Log-Message {
param ([string]$Message)
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
"$timestamp - $Message" | Out-File -FilePath $LogFile -Append
}

Log script start

Log-Message "Script execution started."
Write-Host "Execution started. Logs will be saved to: $LogFile"

Establish the sessions and execute the SQL command on each server in parallel

foreach ($VM in $VMs) {
Try {
# Attempt to create a session to the remote machine
$Session = New-PSSession -ComputerName $VM -ErrorAction Stop
Write-Host "Successfully connected to $VM"
Log-Message "Successfully connected to $VM"

    # Start a background job to execute SQL commands
    $Job = Invoke-Command -Session $Session -ScriptBlock {
        Try {
            Import-Module sqlps -ErrorAction SilentlyContinue

            # Get the SQL Server instance name
            $serverName = $env:COMPUTERNAME.ToLower()
            $instanceNames = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server').InstalledInstances
            $queryResult = ""

            foreach ($instanceName in $instanceNames) {
                $sqlInstance = if ($instanceName -eq "MSSQLSERVER") { 
                    $serverName 
                }
                else { 
                    "$serverName\$instanceName" 
                }

                # Define the SQL query
                $query = "
                
                USE [master]

GO

                "

                Try {
                    # Attempt to execute the query
                    $result = Invoke-Sqlcmd -ServerInstance $sqlInstance -Query $query -QueryTimeout 65535 -ErrorAction Stop
                    $queryResult = "SQL executed successfully on $sqlInstance."
                    $status = "Success!"
                }
                Catch {
                    # Capture any errors from the SQL query execution
                    $lineNumber = $_.InvocationInfo.ScriptLineNumber
                    $queryResult = "Error executing SQL at line $($lineNumber): $($_.Exception.Message)"
                    $status = "Fail"
                }
            }

            # Return the results
            [PSCustomObject]@{
                ComputerName = $serverName
                SQLResult    = $queryResult
                Status       = $status
            }
        }
        Catch {
            # Capture any critical errors within the script block
            $lineNumber = $_.InvocationInfo.ScriptLineNumber
            [PSCustomObject]@{
                ComputerName = $env:COMPUTERNAME
                SQLResult    = "N/A"
                Status       = "Fail - Critical error at line $($lineNumber): $($_.Exception.Message)"
            }
            Log-Message "Critical error on $env:COMPUTERNAME at line $($lineNumber): $($_.Exception.Message)"
        }
    } -AsJob

    # Add the job to the jobs list
    $Jobs += $Job
}
Catch {
    # Capture errors when trying to connect
    $lineNumber = $_.InvocationInfo.ScriptLineNumber
    $Connection += [PSCustomObject]@{
        ComputerName = $VM
        Status       = "Fail"
        ErrorMessage = "Connection error at line $($lineNumber): $($_.Exception.Message)"
    }
    Write-Host "Failed to connect to $VM. Error: $($_.Exception.Message)"
    Log-Message "Failed to connect to $VM at line $lineNumber. Error: $($_.Exception.Message)"
}

}

Wait for all jobs to finish

$Jobs | ForEach-Object {
# Wait for the job to complete
Wait-Job -Job $_

# Fetch the result of the job
$JobResult = Receive-Job -Job $_

# Output the result for each server
Write-Host "Result for $($JobResult.ComputerName):"
Write-Host "SQL Execution Result: $($JobResult.SQLResult)"
Write-Host "Status: $($JobResult.Status)"
Write-Host "----------------------------------------------------"
Log-Message "Result for $($JobResult.ComputerName): SQL Execution Result: $($JobResult.SQLResult) - Status: $($JobResult.Status)"

# Check the job status before removing it
if ($_.State -eq 'Completed') {
    # Clean up the job
    Remove-Job -Job $_
}

}

If there were any connection errors, output them and log

if ($Connection.Count -gt 0) {
Write-Host "Connection Issues:"
Log-Message "Connection Issues:"
$Connection | ForEach-Object {
Write-Host "Computer: $($.ComputerName), Error: $($.ErrorMessage)"
Log-Message "Computer: $($.ComputerName), Error: $($.ErrorMessage)"
}
}

Log script completion

Log-Message "Script execution completed."
Write-Host "Execution completed. Log file saved at: $LogFile"

# for free to join this conversation on GitHub. Already have an account? # to comment
Projects
None yet
Development

No branches or pull requests

2 participants