DevOps

PowerShell for Web Developers: Automation Scripts That Save Hours

Introduction: Automation as a Developer Superpower

Developers spend significant time on repetitive tasks: building projects, running tests, deploying code, managing files, syncing data. PowerShell offers a way to automate these tasks, freeing time for actual development. While many developers default to bash or shell scripts, PowerShell provides powerful automation capabilities that Windows developers often overlook.

This article explores practical PowerShell scripts that solve real development problems and save hours of manual work.

PowerShell Fundamentals for Developers

Variables and Objects

PowerShell is object-oriented by design. Unlike bash which manipulates text, PowerShell manipulates objects:

# Variables $name = "John" $age = 30 $numbers = 1..10 # Objects $user = @{ Name = "John" Age = 30 Email = "john@example.com" } # Array operations $users = @( @{ Name = "John"; Email = "john@example.com" }, @{ Name = "Jane"; Email = "jane@example.com" } ) $users | ForEach-Object { Write-Host "Name: $($_.Name)" }

Cmdlets: PowerShell's Building Blocks

Cmdlets are lightweight commands that perform specific functions. They follow a Verb-Noun naming convention:

# Get information Get-Process | Select-Object ProcessName, Id Get-ChildItem -Path "C:\Projects" -Recurse Get-Content "file.txt" # Change state New-Item -Path "C:\MyFolder" -ItemType Directory Remove-Item "C:\DeleteMe.txt" Copy-Item "source.txt" "destination.txt" # Format output Get-Process | Format-Table -Property Name, Id, WorkingSet Get-Process | Export-Csv -Path "processes.csv"

Practical Script 1: Automated Project Setup

Problem: Creating New Projects Takes Time

Every time you start a new project, you create directories, initialize git, install dependencies, create .gitignore files. Automate this:

# new-project.ps1 param( [string]$ProjectName = $(throw "Project name required"), [string]$Type = "web" # web, cli, library ) $ProjectPath = "C:\Projects\$ProjectName" Write-Host "Creating project: $ProjectName" -ForegroundColor Green # Create directory structure New-Item -ItemType Directory -Path $ProjectPath New-Item -ItemType Directory -Path "$ProjectPath\src" New-Item -ItemType Directory -Path "$ProjectPath\tests" # Initialize git Set-Location $ProjectPath git init git config user.name "Your Name" git config user.email "your@email.com" # Create .gitignore $gitIgnore = @" node_modules/ .env .env.local dist/ build/ *.log .DS_Store "@ $gitIgnore | Out-File -FilePath ".gitignore" # Initialize Node project npm init -y # Install common dependencies based on type switch ($Type) { "web" { npm install express cors dotenv npm install --save-dev nodemon } "cli" { npm install commander chalk } } # Create initial commit git add . git commit -m "Initial project setup" Write-Host "Project created at: $ProjectPath" -ForegroundColor Green

Usage: `./new-project.ps1 -ProjectName MyApp -Type web`

Practical Script 2: Build and Deploy Automation

Problem: Manual Build and Deployment Steps

Deploying involves: build, test, version bump, deploy. Automate the workflow:

# deploy.ps1 param( [string]$Environment = "staging", [switch]$SkipTests ) $ErrorActionPreference = "Stop" function Write-Status { param([string]$Message) Write-Host $Message -ForegroundColor Cyan } try { Write-Status "Starting deployment to $Environment..." # 1. Run tests unless skipped if (-not $SkipTests) { Write-Status "Running tests..." npm test if ($LASTEXITCODE -ne 0) { throw "Tests failed!" } } # 2. Build project Write-Status "Building project..." npm run build if ($LASTEXITCODE -ne 0) { throw "Build failed!" } # 3. Version management $version = (Get-Content package.json | ConvertFrom-Json).version Write-Status "Current version: $version" npm version patch --no-git-tag-version # 4. Create deployment package Write-Status "Creating deployment package..." $timestamp = Get-Date -Format "yyyy-MM-dd-HHmmss" $packageName = "app-$timestamp.zip" Compress-Archive -Path "dist\*", "package.json", "package-lock.json" -DestinationPath $packageName # 5. Deploy based on environment Write-Status "Deploying to $Environment..." if ($Environment -eq "staging") { Copy-Item $packageName "\\deploy-server\staging\$packageName" $deployServer = "staging-server.example.com" } elseif ($Environment -eq "production") { Write-Host "Deploying to PRODUCTION - Type 'yes' to confirm: " -NoNewline $confirm = Read-Host if ($confirm -ne "yes") { throw "Production deployment cancelled" } Copy-Item $packageName "\\deploy-server\production\$packageName" $deployServer = "prod-server.example.com" } # 6. Cleanup Remove-Item $packageName Write-Status "Deployment complete!" -ForegroundColor Green } catch { Write-Host "Deployment failed: $_" -ForegroundColor Red exit 1 }

Practical Script 3: Development Environment Setup

Problem: New Developer? Setup Takes Hours

Create an automated developer onboarding script:

# setup-dev-environment.ps1 Write-Host "Setting up development environment..." -ForegroundColor Green # Check for administrative privileges $isAdmin = [bool]([System.Security.Principal.WindowsIdentity]::GetCurrent().Groups -match "S-1-5-32-544") if (-not $isAdmin) { Write-Host "Error: Administrator privileges required" -ForegroundColor Red exit 1 } # 1. Install Chocolatey (Windows package manager) if (-not (Test-Path "$env:ProgramData\chocolatey")) { Write-Host "Installing Chocolatey..." -ForegroundColor Yellow Set-ExecutionPolicy Bypass -Scope Process -Force iex ((New-Object System.Net.ServicePointManager).SecurityProtocol = 3072; iex(New-Object Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) } # 2. Install required tools $tools = @( "nodejs", "git", "vscode", "docker", "postman", "mongodb-compass" ) foreach ($tool in $tools) { Write-Host "Installing $tool..." -ForegroundColor Yellow choco install $tool -y } # 3. Install npm global packages Write-Host "Installing npm global packages..." -ForegroundColor Yellow npm install -g @angular/cli @vue/cli create-react-app npm install -g typescript ts-node npm install -g eslint prettier # 4. Clone repository $repoPath = Read-Host "Enter repository URL" $projectPath = "$env:USERPROFILE\Projects\$(Split-Path -Leaf $repoPath).Replace('.git', '')" git clone $repoPath $projectPath # 5. Install project dependencies Set-Location $projectPath npm install # 6. Setup environment file if (Test-Path ".env.example") { Copy-Item ".env.example" ".env.local" Write-Host "Created .env.local from .env.example" -ForegroundColor Yellow Write-Host "IMPORTANT: Update .env.local with your local settings" } Write-Host "Development environment setup complete!" -ForegroundColor Green

Practical Script 4: Git Operations Automation

Problem: Repetitive Git Workflows

Automate common git workflows:

# git-sync.ps1 - Pull latest from main and update current branch Write-Host "Syncing git repositories..." -ForegroundColor Green $projectsPath = "$env:USERPROFILE\Projects" Get-ChildItem -Path $projectsPath -Directory | ForEach-Object { $repoPath = $_.FullName if (Test-Path "$repoPath\.git") { Write-Host "`nUpdating: $($_.Name)" -ForegroundColor Cyan Set-Location $repoPath # Get current branch $currentBranch = git rev-parse --abbrev-ref HEAD # Fetch latest git fetch origin # Pull latest from main git checkout main 2>$null git pull origin main # Return to original branch git checkout $currentBranch git pull origin $currentBranch Write-Host "✓ Updated" -ForegroundColor Green } } Write-Host "`nAll repositories synced!" -ForegroundColor Green

Practical Script 5: Log Analysis and Debugging

Problem: Finding Errors in Logs Takes Time

Quickly search and analyze logs:

# analyze-logs.ps1 param( [string]$LogPath = "logs\app.log", [string]$ErrorLevel = "ERROR", [int]$LastNHours = 24 ) if (-not (Test-Path $LogPath)) { Write-Host "Log file not found: $LogPath" -ForegroundColor Red exit 1 } # Calculate time threshold $timeThreshold = (Get-Date).AddHours(-$LastNHours) # Read and analyze logs $logs = @() Get-Content $LogPath | ForEach-Object { try { # Assuming JSON formatted logs $log = $_ | ConvertFrom-Json if ($log.level -eq $ErrorLevel) { $logTime = [datetime]$log.timestamp if ($logTime -gt $timeThreshold) { $logs += $log } } } catch { # If not JSON, try text matching if ($_ -match $ErrorLevel) { $logs += $_ } } } # Group errors by type and display $logs | Group-Object -Property message | ForEach-Object { Write-Host "`nError: $($_.Name)" -ForegroundColor Red Write-Host "Occurrences: $($_.Count)" -ForegroundColor Yellow Write-Host "First occurrence:" -ForegroundColor Cyan $_.Group[0] | Format-List }
Pro Tip: Store these scripts in a central location and add to your PATH. Create a `functions.ps1` file and source it from your PowerShell profile for instant access to custom commands.

Best Practices for Development Automation

Error Handling

Always handle errors gracefully:

$ErrorActionPreference = "Stop" # Stop on any error try { # Your code here npm run build npm test } catch { Write-Host "Error occurred: $_" -ForegroundColor Red exit 1 # Fail the script } finally { # Cleanup regardless of success/failure Set-Location $originalLocation }

Logging and Output

Make scripts informative:

function Write-Log { param( [string]$Message, [string]$Level = "INFO" ) $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" $colors = @{ "INFO" = "White" "SUCCESS" = "Green" "WARNING" = "Yellow" "ERROR" = "Red" } $color = $colors[$Level] Write-Host "[$timestamp] [$Level] $Message" -ForegroundColor $color }

Integrating with Your Workflow

Create a Custom Profile

PowerShell runs `$PROFILE` on startup. Customize it:

# Edit your profile $PROFILE # Shows path # Add these to profile Set-Alias -Name proj -Value 'Set-Location "$env:USERPROFILE\Projects"' Set-Alias -Name deploy -Value 'C:\Scripts\deploy.ps1' # Function for quick git operations function gs { git status } function gca { git commit -am $args } function gp { git push } function gl { git log --oneline -5 }

Conclusion: Automation Multiplies Productivity

PowerShell automation isn't just about saving time on individual tasks. It's about building muscle memory for efficient workflows. The more you automate, the faster you work, and the more time you have for actual development. Start with one script, then build from there. Over time, you'll have a powerful toolkit that supercharges your productivity.

Ready to Automate Your Workflows?

Connect with me on LinkedIn to discuss DevOps automation and developer productivity tools.