contents
preface
about this book
about the authors
acknowledgments
Part 1 Introduction to toolmaking
- 1 Before you begin
- 1.1 What is toolmaking?
- 1.2 Is this book for you?
- 1.3 Prerequisites
- 1.4 How to use this book
- 2 PowerShell scripting overview
- 2.1 What is PowerShell scripting?
- 2.2 PowerShell’s execution policy
- 2.3 Running scripts
- 2.4 Editing scripts
- 2.5 Further exploration: script editors
- 2.6 Lab
- 3 PowerShell’s scripting language
- 3.1 One script, one pipeline
- 3.2 Variables
- 3.3 Quotation marks
- 3.4 Object members and variables
- 3.6 Parentheses
- 3.7 Refresher: comparisons
- 3.8 Logical constructs
- 3.9 Looping constructs
- 3.10 Break and Continue in constructs
- 3.11 Lab
- 4 Simple scripts and functions
- 4.1 Start with a command
- 4.2 Turn the command into a script
- 4.3 Parameterize the command
- 4.4 Turn the script into a function
- 4.5 Testing the function
- 4.6 Lab
- 5 Scope
- 5.1 What is scope?
- 5.2 Seeing scope in action
- 5.3 Working out of scope
- 5.4 Getting strict with scope
- 5.5 Best practices for scope
- 5.6 Lab
Part 2 Building an inventory tool
- 6 Tool design guidelines
- 6.1 Do one thing, and do it well
- 6.2 Labs
- 7 Advanced functions, part 1
- 7.1 Advanced function template
- 7.2 Designing the function
- 7.3 Declaring parameters
- 7.4 Testing the parameters
- 7.5 Writing the main code
- 7.6 Outputting custom objects
- 7.7 What not to do
- 7.8 Coming up next
- 7.9 Labs
- 8 Advanced functions, part 2
- 8.1 Making parameters mandatory
- 8.2 Verbose output
- 8.3 Parameter aliases
- 8.2 Accepting pipeline input
- 8.3 Parameter validation
- 8.4 Adding a switch parameter
- 8.5 Parameter help
- 8.6 Coming up next
- 8.7 Labs
- 9 Writing help
- 9.1 Comment-based help
- 9.2 XML-based help
- 9.3 Coming up next
- 9.4 Labs
- 10 Error handling
- 10.1 It’s all about the action
- 10.2 Setting the error action
- 10.3 Saving the error
- 10.4 Error handling v1: Trap
- 10.5 Error Handling v2+: Try…Catch…Finally
- 10.6 Providing some visuals
- 10.7 Coming up next
- 10.8 Labs
- 11 Debugging techniques
- 11.1 Two types of bugs
- 11.2 Solving typos
- 11.3 The real trick to debugging: expectations
- 11.4 Dealing with logic errors: trace code
- 11.5 Dealing with logic errors: breakpoints
- 11.6 Seriously, have expectations
- 11.7 Coming up next
- 11.8 Lab
- 12 Creating custom format views
- 12.1 The anatomy of a view
- 12.2 Adding a type name to output objects
- 12.3 Making a view
- 12.4 Loading and debugging the view
- 12.5 Using the view
- 12.6 Coming up next
- 12.7 Labs
- 13 Script and manifest modules
- 13.1 Introducing modules
- 13.2 Creating a script module
- 13.3 Creating a module manifest
- 13.4 Creating a module-level setting variable
- 13.5 Coming up next
- 13.6 Lab
- 14 Adding database access
- 14.1 Simplifying database access
- 14.2 Setting up your environment
- 14.3 The database functions
- 14.4 About the database functions
- 14.5 Using the database functions
- 14.6 Lab
- 15 Interlude: creating a new tool
- 15.1 Designing the tool
- 15.2 Writing and testing the function
- 15.3 Dressing up the parameters
- 15.4 Adding help
- 15.5 Handling errors
- 15.6 Making a module
- 15.7 Coming up next
Part 3 Advanced toolmaking techniques
- 16 Making tools that make changes
- 16.1 The –Confirm and –WhatIf parameters
- 16.2 Passthrough ShouldProcess
- 16.3 Defining the impact level
- 16.4 Implementing ShouldProcess
- 16.5 Lab
- 17 Creating a custom type extension
- 17.1 The anatomy of an extension
- 17.2 Creating a script property
- 17.3 Creating a script method
- 17.4 Loading the extension
- 17.5 Testing the extension
- 17.6 Adding the extension to a manifest
- 17.7 Lab
- 18 Creating PowerShell workflows
- 18.1 Workflow overview
- 18.2 General workflow design strategy
- 18.3 Example workflow scenario
- 18.4 Writing the workflow
- 18.5 Workflows vs. functions
- 18.6 Lab
- 19 Troubleshooting pipeline input
- 19.1 Refresher: how pipeline input works
- 19.2 Introducing Trace-Command
- 19.3 Interpreting trace-command output
- 19.4 Lab
- 20 Using object hierarchies for complex output
- 20.1 When a hierarchy might be necessary
- 20.2 Hierarchies and CSV: not a good idea
- 20.3 Creating nested objects
- 20.4 Working with nested objects
- 20.5 Lab
- 21 Globalizing a function
- 21.1 Introduction to globalization
- 21.2 PowerShell’s data language
- 21.3 Storing translated strings
- 21.4 Do you need to globalize?
- 21.5 Lab
- 22 Crossing the line: utilizing the .NET Framework
- 22.1 .NET classes and instances
- 22.2 Static methods of a class
- 22.3 Instantiating a class
- 22.4 Using Reflection
- 22.5 Finding class documentation
- 22.6 PowerShell vs. Visual Studio
- 22.7 Lab
Part 4 Creating tools for delegated administration
- 23 Creating a GUI tool, part 1: the GUI
- 23.1 Introduction to WinForms
- 23.2 Using a GUI to create the GUI
- 23.3 Manually coding the GUI
- 23.4 Showing the GUI
- 23.5 Lab
- 24 Creating a GUI tool, part 2: the code
- 24.1 Addressing GUI objects
- 24.2 Example: text boxes
- 24.3 Example: button clicks
- 24.4 Example: list boxes
- 24.5 Example: radio buttons
-
- 24.6 Example: check boxes
- 24.6 Lab
- 25 Creating a GUI tool, part 3: the output
- 25.1 Using Out-GridView
- 25.2 Creating a form for output
- 25.3 Populating and showing the output
- 25.4 Lab
- 26 Creating proxy functions
- 26.1 What are proxy functions?
- 26.2 Creating the proxy function template
- 26.3 Removing a parameter
- 26.4 Adding a parameter
- 26.5 Loading the proxy function
- 26.6 Lab
- 27 Setting up constrained remoting endpoints
- 27.1 Refresher: Remoting architecture
- 27.2 What are constrained endpoints?
- 27.3 Creating the endpoint definition
- 27.4 Registering the endpoint
- 27.5 Connecting to the endpoint
- 27.6 Lab
- 28 Never the end
- 28.1 Welcome to toolmaking
- 28.2 Cool ideas for tools
- 28.3 What’s your next step?
 
appendix GUI technologies and PowerShell
index