├── Add-AzureLocalResource.ps1 ├── Add-AzureRole.ps1 ├── Add-AzureSetting.ps1 ├── Add-AzureStartupTask.ps1 ├── Add-AzureWebSite.ps1 ├── Add-Deployment.ps1 ├── Add-EC2.ps1 ├── Add-Interaction.ps1 ├── Add-SQLTable.ps1 ├── Add-SecureSetting.ps1 ├── Assets ├── Pipeworks_48.png ├── PowerShellPipeworks_150.png ├── PowerShellPipeworks_30.png ├── PowerShellPipeworks_310_150.png ├── PowerShellPipeworks_50.png └── PowerShellPipeworks_620_300.png ├── CSharp ├── AddAzureTableCommand.cs ├── AzureStorageCmdletBase.cs ├── AzureTableCmdletBase.cs ├── GetAzureTableCommand.cs ├── RemoveAzureTableCommand.cs ├── SearchAzureTableCommand.cs ├── SetAzureTableCommand.cs └── UpdateAzureTableCommand.cs ├── Close-Port.ps1 ├── Compress-Data.ps1 ├── Confirm-Person.ps1 ├── Connect-EC2.ps1 ├── ConvertFrom-InlinePowerShell.ps1 ├── ConvertFrom-Markdown.ps1 ├── ConvertTo-DataTable.ps1 ├── ConvertTo-ModuleService.ps1 ├── ConvertTo-ServiceUrl.ps1 ├── Enable-EC2Remoting.ps1 ├── Expand-Data.ps1 ├── Expand-Zip.ps1 ├── Export-Blob.ps1 ├── Export-DataTable.ps1 ├── Export-PSData.ps1 ├── Find-Factual.ps1 ├── Get-Ami.ps1 ├── Get-Bootstrapped.ps1 ├── Get-Deployment.ps1 ├── Get-EC2.ps1 ├── Get-EC2AvailabilityZone.ps1 ├── Get-EC2InstancePassword.ps1 ├── Get-EC2KeyPair.ps1 ├── Get-EC2SecurityGroup.ps1 ├── Get-Email.old.ps1 ├── Get-Email.ps1 ├── Get-FunctionFromScript.ps1 ├── Get-Hash.ps1 ├── Get-Paid.ps1 ├── Get-PhoneCall.ps1 ├── Get-PipeworksManifest.ps1 ├── Get-SQLTable.ps1 ├── Get-SecureSetting.ps1 ├── Get-TextMessage.ps1 ├── Get-Translation.ps1 ├── Get-Walkthru.ps1 ├── Get-Web.ps1 ├── Get-WebConfigurationSetting.ps1 ├── Get-WebInput.ps1 ├── Get-WebTemplateEditableRegion.ps1 ├── Import-Blob.ps1 ├── Import-DataTable.ps1 ├── Import-Deployment.ps1 ├── Import-PSData.ps1 ├── Import-StoredProcedure.ps1 ├── Install-PSNode.ps1 ├── Invoke-EC2.ps1 ├── Invoke-Office365.ps1 ├── Invoke-Parallel.ps1 ├── Invoke-WebCommand.ps1 ├── Join-Website.ps1 ├── License.md ├── New-AzureServiceDefinition.ps1 ├── New-Datatable.ps1 ├── New-PipeworksManifest.ps1 ├── New-RDPFile.ps1 ├── New-Region.ps1 ├── New-RssItem.ps1 ├── New-SQLDatabase.ps1 ├── New-Webpage.ps1 ├── Open-EC2Port.ps1 ├── Open-Port.ps1 ├── Out-AzureService.ps1 ├── Out-Daemon.ps1 ├── Out-HTML.ps1 ├── Out-RssFeed.ps1 ├── Out-Zip.ps1 ├── Pages └── favicon.ico ├── Pipeworks.EzFormat.ps1 ├── Pipeworks.Format.ps1xml ├── Pipeworks.Pipeworks.psd1 ├── Pipeworks.Scriptcop.psd1 ├── Pipeworks.VersionHistory.psd1 ├── Pipeworks.psd1 ├── Pipeworks.psm1 ├── Publish-AzureService.ps1 ├── Publish-Deployment.ps1 ├── Push-Deployment.ps1 ├── Push-FTP.ps1 ├── ReadMe.md ├── Remove-Daemon.ps1 ├── Remove-Deployment.ps1 ├── Remove-EC2.ps1 ├── Remove-EC2KeyPair.ps1 ├── Remove-EC2SecurityGroup.ps1 ├── Remove-SQL.ps1 ├── Remove-SecureSetting.ps1 ├── Request-CommandInput.ps1 ├── Reset-EC2.ps1 ├── Resolve-Location.ps1 ├── Schematics ├── Blog │ └── Use-BlogSchematic.ps1 ├── Bookshelf │ └── Use-BookshelfSchematic.ps1 ├── Bot │ └── Use-BotSchematic.ps1 ├── CheckpointData │ └── Use-CheckpointDataSchematic.ps1 ├── Crudbin │ └── Use-CrudBinSchematic.ps1 ├── Dashboard │ └── Use-DashboardSchematic.ps1 ├── Gallery │ └── Use-GallerySchematic.ps1 ├── Interested │ └── Use-InterestedSchematic.ps1 ├── ObjectPage │ └── Use-ObjectPageSchematic.ps1 ├── ParkingMeter │ ├── Use-ParkingMeterSchematic.ps1 │ └── Watch-Meter.ps1 ├── PartWiki │ └── Use-PartWikiSchematic.ps1 ├── SimpleSearch │ └── Use-SimpleSearchSchematic.ps1 ├── StagePage │ └── Use-StagePageSchematic.ps1 └── Win8 │ └── Use-Win8Schematic.ps1 ├── Search-Engine.ps1 ├── Search-WolframAlpha.ps1 ├── Select-DataTable.ps1 ├── Select-Sql.ps1 ├── Select-Wmi.ps1 ├── Send-Email.ps1 ├── Send-PhoneCall.ps1 ├── Send-TextMessage.ps1 ├── Set-AWSConnectionInfo.ps1 ├── Show-WebObject.ps1 ├── Start-MapReduce.ps1 ├── Start-PSNode.ps1 ├── Switch-TestDeployment.ps1 ├── Templates ├── Command-InvertedHeader.pswt ├── Command.pswt ├── Module-InvertedHeader.pswt ├── Module.pswt ├── Topic-InvertedHeader.pswt └── Topic.pswt ├── Test-W3C.ps1 ├── Tests └── SQL │ ├── Create_And_Update_MySQL.test.ps1 │ ├── Create_And_Update_SqlCompact.test.ps1 │ ├── Create_And_Update_SqlServer.test.ps1 │ └── Create_And_Update_Sqlite.test.ps1 ├── Update-DataTable.ps1 ├── Update-SQL.ps1 ├── Use-Less.ps1 ├── Use-Schematic.ps1 ├── Wait-Deployment.ps1 ├── Wait-EC2.ps1 ├── Watch-Daemon.ps1 ├── Write-Ajax.ps1 ├── Write-AspNetScriptPage.ps1 ├── Write-CSS.ps1 ├── Write-Host.ps1 ├── Write-Link.ps1 ├── Write-PowerShellHashtable.ps1 ├── Write-ScriptHTML.ps1 ├── Write-WalkthruHTML.ps1 ├── bin └── Microsoft.Exchange.WebServices.dll ├── css └── Pipeworks.less ├── en-us ├── A_Simple_Stockticker.walkthru.help.txt ├── About_the_Pipeworks_Manifest_-_AdSense.help.txt ├── About_the_Pipeworks_Manifest_-_Ajax.help.txt ├── About_the_Pipeworks_Manifest_-_AllowDownload.help.txt ├── About_the_Pipeworks_Manifest_-_AmazonPaymentsAccountId.help.txt ├── About_the_Pipeworks_Manifest_-_AnalyticsID.help.txt ├── About_the_Pipeworks_Manifest_-_Antisocial.help.txt ├── About_the_Pipeworks_Manifest_-_AppPoolPasswordSetting.help.txt ├── About_the_Pipeworks_Manifest_-_AppPoolUser.help.txt ├── About_the_Pipeworks_Manifest_-_AsIntranetSite.help.txt ├── About_the_Pipeworks_Manifest_-_BingValidationKey.help.txt ├── About_the_Pipeworks_Manifest_-_Blog.help.txt ├── About_the_Pipeworks_Manifest_-_Bootstrap.help.txt ├── About_the_Pipeworks_Manifest_-_Branding.help.txt ├── About_the_Pipeworks_Manifest_-_CommandOrder.help.txt ├── About_the_Pipeworks_Manifest_-_CommandTemplate.help.txt ├── About_the_Pipeworks_Manifest_-_CommandTrigger.help.txt ├── About_the_Pipeworks_Manifest_-_Css.help.txt ├── About_the_Pipeworks_Manifest_-_DefaultCommand.help.txt ├── About_the_Pipeworks_Manifest_-_DefaultTemplate.help.txt ├── About_the_Pipeworks_Manifest_-_DomainSchematics.help.txt ├── About_the_Pipeworks_Manifest_-_Download.help.txt ├── About_the_Pipeworks_Manifest_-_ExecutionTimeout.help.txt ├── About_the_Pipeworks_Manifest_-_Facebook.help.txt ├── About_the_Pipeworks_Manifest_-_GitIt.help.txt ├── About_the_Pipeworks_Manifest_-_GoogleMerchantId.help.txt ├── About_the_Pipeworks_Manifest_-_GoogleSiteVerification.help.txt ├── About_the_Pipeworks_Manifest_-_Group.help.txt ├── About_the_Pipeworks_Manifest_-_HiddenTopic.help.txt ├── About_the_Pipeworks_Manifest_-_HideUngrouped.help.txt ├── About_the_Pipeworks_Manifest_-_IgnoreBuiltInCommand.help.txt ├── About_the_Pipeworks_Manifest_-_InnerRegion.help.txt ├── About_the_Pipeworks_Manifest_-_JQueryUITheme.help.txt ├── About_the_Pipeworks_Manifest_-_JavaScript.help.txt ├── About_the_Pipeworks_Manifest_-_Keyword.help.txt ├── About_the_Pipeworks_Manifest_-_LiveConnect.help.txt ├── About_the_Pipeworks_Manifest_-_Logo.help.txt ├── About_the_Pipeworks_Manifest_-_MainRegion.help.txt ├── About_the_Pipeworks_Manifest_-_MaximumRequestLength.help.txt ├── About_the_Pipeworks_Manifest_-_MemberTopic.help.txt ├── About_the_Pipeworks_Manifest_-_ModuleTemplate.help.txt ├── About_the_Pipeworks_Manifest_-_Nest.help.txt ├── About_the_Pipeworks_Manifest_-_Organization.help.txt ├── About_the_Pipeworks_Manifest_-_PaymentProcessing.help.txt ├── About_the_Pipeworks_Manifest_-_PoolSize.help.txt ├── About_the_Pipeworks_Manifest_-_Port.help.txt ├── About_the_Pipeworks_Manifest_-_PrivacyPolicy.help.txt ├── About_the_Pipeworks_Manifest_-_PubCenter.help.txt ├── About_the_Pipeworks_Manifest_-_PublishDirectory.help.txt ├── About_the_Pipeworks_Manifest_-_Schema.help.txt ├── About_the_Pipeworks_Manifest_-_SecureSetting.help.txt ├── About_the_Pipeworks_Manifest_-_ShortCut.help.txt ├── About_the_Pipeworks_Manifest_-_ShowTweet.help.txt ├── About_the_Pipeworks_Manifest_-_SimplePages.help.txt ├── About_the_Pipeworks_Manifest_-_SlideShow.help.txt ├── About_the_Pipeworks_Manifest_-_Stealth.help.txt ├── About_the_Pipeworks_Manifest_-_Style.help.txt ├── About_the_Pipeworks_Manifest_-_Table.help.txt ├── About_the_Pipeworks_Manifest_-_Template.help.txt ├── About_the_Pipeworks_Manifest_-_TopicTemplate.help.txt ├── About_the_Pipeworks_Manifest_-_TrustedWalkthrus.help.txt ├── About_the_Pipeworks_Manifest_-_Tweet.help.txt ├── About_the_Pipeworks_Manifest_-_TwitterId.help.txt ├── About_the_Pipeworks_Manifest_-_UseBootstrap.help.txt ├── About_the_Pipeworks_Manifest_-_UseGRaphael.help.txt ├── About_the_Pipeworks_Manifest_-_UseJQuery.help.txt ├── About_the_Pipeworks_Manifest_-_UseJQueryUI.help.txt ├── About_the_Pipeworks_Manifest_-_UseRaphael.help.txt ├── About_the_Pipeworks_Manifest_-_UseShiv.help.txt ├── About_the_Pipeworks_Manifest_-_UseTableSorter.help.txt ├── About_the_Pipeworks_Manifest_-_UserTable.help.txt ├── About_the_Pipeworks_Manifest_-_WebCommand.help.txt ├── About_the_Pipeworks_Manifest_-_WebWalkthrus.help.txt ├── Building_With_Bootstrap.walkthru.help.txt ├── Building_with_Blob_Storage.walkthru.help.txt ├── Creating_a_CitiBike_Station_Finder.walkthru.help.txt ├── From_Script_To_Software_Service.Walkthru.help.txt ├── Get-Paid_with_Stripe.walkthru.help.txt ├── Get-Web_Content_From_Anywhere.walkthru.help.txt ├── Getting_GitIt.walkthru.help.txt ├── Getting_Started_With_Pipeworks.md ├── Implicit_Texting_With_Twilio.help.txt ├── Integrated_Intranet.help.txt ├── JQueryUI_In_Pipeworks.help.txt ├── Looking_Up_Locations_With_Resolve-Location.walkthru.help.txt ├── Making_Editing_Easier_With_Markdown.walkthru.help.txt ├── Making_Tables_With_Out-HTML.walkthru.help.txt ├── Managing_Amazon_Web_Services_With_PowerShell_Pipeworks.walkthru.help.txt ├── New-Region_And_JQueryUI.walkthru.help.txt ├── New-Webpage_and_JQuery.walkthru.help.txt ├── NoHTML_Sites.help.txt ├── Pick_up_the_Phone_with_Pipeworks.walkthru.help.txt ├── Pipeworks_Quickstart.walkthru.help.txt ├── Pipeworks_Writes_CRUD.walkthru.help.txt ├── Powerful_Powershell_Formatting.help.txt ├── Publishing_Pipeworks_To_Azure.walkthru.help.txt ├── Scripting_Securely_with_SecureSettings.walkthru.help.txt ├── Scripting_With_Superglue.help.txt ├── Simpler_SEO.walkthru.help.txt ├── Simplified_SQL.walkthru.help.txt ├── Simplifying_Slideshows.walkthru.help.txt ├── The_Pipeworks_Manifest.help.txt ├── The_Wonders_Of_Wolfram_Alpha.walkthru.help.txt ├── Using_Azure_Table_Storage_in_Pipeworks.walkthru.help.txt ├── What_Pipeworks_Does.help.txt ├── Why_Windows.help.txt ├── Working_With_Write-Link.walkthru.help.txt └── about_Pipeworks.help.txt ├── get-blob.ps1 ├── get-ftp.ps1 ├── get-person.ps1 ├── publish-WebSite.ps1 ├── remove-blob.ps1 ├── start-at.ps1 ├── update-wmi.ps1 └── write-crud.ps1 /Add-AzureLocalResource.ps1: -------------------------------------------------------------------------------- 1 | function Add-AzureLocalResource 2 | { 3 | <# 4 | .Synopsis 5 | Adds an Azure local storage resource to a service definition 6 | .Description 7 | Adds an Azure local storage resource to a service definition. 8 | 9 | Azure local storage can create well-known directories on the host machine 10 | .Example 11 | New-AzureServiceDefinition -ServiceName "foo" | 12 | Add-AzureLocalResource -ServiceDefinition 13 | .Link 14 | New-AzureServiceDefinition 15 | #> 16 | [OutputType([xml],[string])] 17 | param( 18 | # The ServiceDefinition XML. This should be created with New-AzureServiceDefinition or retreived with Import-AzureServiceDefinition 19 | [Parameter(Mandatory=$true, 20 | ValueFromPipeline=$true, 21 | ValueFromPipelineByPropertyName=$true)] 22 | [ValidateScript({ 23 | $isServiceDefinition = $_.NameTable.Get("http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition") 24 | if (-not $IsServiceDefinition) { 25 | throw "Input must be a ServiceDefinition XML" 26 | } 27 | return $true 28 | })] 29 | [Xml] 30 | $ServiceDefinition, 31 | 32 | # If set, the local resource will only apply to the role named ToRole. If ToRole is not found, or doesn't 33 | # exist, the last role will be used. 34 | [string] 35 | $ToRole, 36 | 37 | # The name of the local storage. This will be the path of the name storage element, relative to the root drive. 38 | [Parameter(Mandatory=$true)] 39 | [string] 40 | $Name, 41 | 42 | # The size of the storage. Sizes will be rounded up to the nearest megabyte. 43 | [Long] 44 | $Size = 1mb, 45 | 46 | # If set, a role will not be cleaned on recycle 47 | [switch] 48 | $DoNotcleanOnRoleRecycle, 49 | 50 | # If set, will output results as string rather than XML 51 | [switch] 52 | $AsString 53 | ) 54 | 55 | process { 56 | 57 | #region Resolve the role if it set, create the role if it doesn't exist, and track it if they assume the last item. 58 | $roles = @($ServiceDefinition.ServiceDefinition.WebRole), @($ServiceDefinition.ServiceDefinition.WorkerRole) + @($ServiceDefinition.ServiceDefinition.VirtualMachineRole) 59 | $xmlNamespace = @{'ServiceDefinition'='http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition'} 60 | $selectXmlParams = @{ 61 | XPath = '//ServiceDefinition:WebRole|//ServiceDefinition:WorkerRole|//ServiceDefinition:VirtualMachineRole' 62 | Namespace = $xmlNamespace 63 | } 64 | $roles = @(Select-Xml -Xml $ServiceDefinition @selectXmlParams | 65 | Select-Object -ExpandProperty Node) 66 | if (-not $roles) { 67 | $ServiceDefinition = $ServiceDefinition | 68 | Add-AzureRole -RoleName "WebRole1" 69 | 70 | $roles = @(Select-Xml -Xml $ServiceDefinition @selectXmlParams | 71 | Select-Object -ExpandProperty Node) 72 | } 73 | #endregion Resolve the role if it set, create the role if it doesn't exist, and track it if they assume the last item. 74 | 75 | if ($roles.Count -gt 1) { 76 | if ($ToRole) { 77 | } else { 78 | $role = $roles[-1] 79 | } 80 | } else { 81 | if ($ToRole) { 82 | if ($roles[0].Name -eq $ToRole) { 83 | $role = $roles[0] 84 | } else { 85 | $role = $null 86 | } 87 | } else { 88 | $role = $roles[0] 89 | } 90 | } 91 | 92 | if (-not $role) { return } 93 | 94 | $realSize = [Math]::Ceiling($size / 1mb) 95 | 96 | if (-not $role.LocalResources) { 97 | $role.InnerXml += "" 98 | } 99 | 100 | $localResourcesNode = Select-Xml -Xml $role -Namespace $xmlNamespace -XPath '//ServiceDefinition:LocalResources' | 101 | Select-Object -ExpandProperty Node 102 | 103 | $localResourcesNode.InnerXml += "" 104 | 105 | } 106 | 107 | end { 108 | if ($AsString) { 109 | $strWrite = New-Object IO.StringWriter 110 | $serviceDefinition.Save($strWrite) 111 | return "$strWrite" 112 | } else { 113 | $serviceDefinition 114 | } 115 | } 116 | } 117 | -------------------------------------------------------------------------------- /Add-AzureRole.ps1: -------------------------------------------------------------------------------- 1 | function Add-AzureRole 2 | { 3 | <# 4 | .Synopsis 5 | Adds and azure role to a service definition 6 | .Description 7 | Adds an azure role to a service definition 8 | .Example 9 | New-AzureServiceDefinition -ServiceName AService | 10 | Add-AzureRole -RoleName MyWebRole -VMSize Large -RoleType Web -AsString 11 | .Link 12 | New-AzureServiceDefinition 13 | #> 14 | [OutputType([xml],[string])] 15 | param( 16 | # The Service Definition 17 | [Parameter(Mandatory=$true, 18 | ValueFromPipeline=$true, 19 | ValueFromPipelineByPropertyName=$true)] 20 | [ValidateScript({ 21 | $isServiceDefinition = $_.NameTable.Get("http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition") 22 | if (-not $IsServiceDefinition) { 23 | throw "Input must be a ServiceDefinition XML" 24 | } 25 | return $true 26 | })] 27 | [Xml] 28 | $ServiceDefinition, 29 | 30 | # The name of the role 31 | [Parameter(Mandatory=$true, 32 | ValueFromPipelineByPropertyName=$true)] 33 | [string] 34 | $RoleName, 35 | 36 | # The VMSize 37 | [ValidateSet('ExtraSmall','Small','Medium', 'Large', 'Extra-Large', 'XS', 'XL', 'S', 'M', 'L')] 38 | [string] 39 | $VMSize, 40 | 41 | # If set, will disable native code execution on the role. This will prevent PHP or other CGI from working 42 | [Switch] 43 | $DisableNativeCodeExecution, 44 | 45 | # If set, will output as a string 46 | [switch] 47 | $AsString, 48 | 49 | # The type of the role. 50 | [ValidateSet('Web','Worker','VirtualMachine', 'VM')] 51 | [string] 52 | $RoleType = 'Web' 53 | ) 54 | 55 | process { 56 | #region Correct Parameters 57 | $enableNativeCodeExecution = (-not $DisableNativeCodeExecution).ToString().ToLower() 58 | $vmSize = if ('XS' -eq $VmSize) { 59 | "ExtraSmall" 60 | } elseif ('XL' -eq $VmSize) { 61 | "ExtraLarge" 62 | } elseif ('M' -eq $VmSize) { 63 | "Medium" 64 | } elseif ('S' -eq $VmSize) { 65 | "Small" 66 | } elseif ('L' -eq $VmSize) { 67 | "Large" 68 | } elseif ($vmSize) { 69 | $vmSize 70 | } else { 71 | $null 72 | } 73 | 74 | if ($vmSize) { 75 | # Force every instance of a subword into camel case 76 | foreach ($subWord in 'Extra','Small', 'Medium', 'Large') { 77 | $vmSize= $vmSize -ireplace $subWord, $subWord 78 | } 79 | } 80 | #endregion Correct Parameters 81 | 82 | $roleElement = if ($roleType -eq 'Web') { 83 | "WebRole" 84 | } elseif ($roleType -eq 'Worker') { 85 | "WorkerRole" 86 | } elseif ('VirtualMachine', 'VM' -contains $roleType) { 87 | "VirtualMachineRole" 88 | } 89 | 90 | if ($vmSize) { 91 | @($serviceDefinition.ChildNodes)[-1].InnerXml += "<$roleElement name='$RoleName' vmsize='$VMSize' enableNativeCodeExecution='$enableNativeCodeExecution' />" 92 | } else { 93 | @($serviceDefinition.ChildNodes)[-1].InnerXml += "<$roleElement name='$RoleName' enableNativeCodeExecution='$enableNativeCodeExecution' />" 94 | } 95 | 96 | 97 | } 98 | 99 | end { 100 | if ($AsString) { 101 | $strWrite = New-Object IO.StringWriter 102 | $serviceDefinition.Save($strWrite) 103 | return "$strWrite" 104 | } else { 105 | $serviceDefinition 106 | } 107 | } 108 | } 109 | -------------------------------------------------------------------------------- /Add-AzureSetting.ps1: -------------------------------------------------------------------------------- 1 | function Add-AzureSetting 2 | { 3 | <# 4 | .Synopsis 5 | Adds an Azure local storage resource to a service definition 6 | .Description 7 | Adds an Azure local storage resource to a service definition. 8 | 9 | Azure local storage can create well-known directories on the host machine 10 | .Link 11 | New-AzureServiceDefinition 12 | .Example 13 | New-AzureServiceDefinition -ServiceName MyService | 14 | Add-AzureSetting -Name MySetting -Value MyValue -AsString 15 | #> 16 | [CmdletBinding(DefaultParameterSetName='NameAndValue')] 17 | [OutputType([xml],[string])] 18 | param( 19 | # The ServiceDefinition XML. This should be created with New-AzureServiceDefinition or retreived with Import-AzureServiceDefinition 20 | [Parameter(Mandatory=$true, 21 | ValueFromPipeline=$true, 22 | ValueFromPipelineByPropertyName=$true)] 23 | [ValidateScript({ 24 | $isServiceDefinition = $_.NameTable.Get("http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition") 25 | if (-not $IsServiceDefinition) { 26 | throw "Input must be a ServiceDefinition XML" 27 | } 28 | return $true 29 | })] 30 | [Xml] 31 | $ServiceDefinition, 32 | 33 | # The name of the setting to configure 34 | [Parameter(Mandatory=$true, ParameterSetName='NameAndValue')] 35 | [string] 36 | $Name, 37 | 38 | # The value to us for the setting 39 | [Parameter(Mandatory=$true, ParameterSetName='NameAndValue')] 40 | [string] 41 | $Value, 42 | 43 | # A table of names and values for Azure settings 44 | [Parameter(Mandatory=$true, ParameterSetName='SettingTable')] 45 | [Hashtable] 46 | $Setting, 47 | 48 | # If set, will output results as string rather than XML 49 | [switch] 50 | $AsString 51 | ) 52 | 53 | process { 54 | if ($psCmdlet.ParameterSetName -eq 'NameAndValue') { 55 | # Resolve the role if it set, create the role if it doesn't exist, and track it if they assume the last item. 56 | $roles = @($ServiceDefinition.ServiceDefinition.WebRole), 57 | @($ServiceDefinition.ServiceDefinition.WorkerRole) + 58 | @($ServiceDefinition.ServiceDefinition.VirtualMachineRole) 59 | $xmlNamespace = @{'ServiceDefinition'='http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition'} 60 | $selectXmlParams = @{ 61 | XPath = '//ServiceDefinition:WebRole|//ServiceDefinition:WorkerRole|//ServiceDefinition:VirtualMachineRole' 62 | Namespace = $xmlNamespace 63 | } 64 | $roles = @(Select-Xml -Xml $ServiceDefinition @selectXmlParams | 65 | Select-Object -ExpandProperty Node) 66 | if (-not $roles) { 67 | $ServiceDefinition = $ServiceDefinition | 68 | Add-AzureRole -RoleName "WebRole1" 69 | 70 | $roles = @(Select-Xml -Xml $ServiceDefinition @selectXmlParams | 71 | Select-Object -ExpandProperty Node) 72 | } 73 | 74 | if ($roles.Count -gt 1) { 75 | if ($ToRole) { 76 | } else { 77 | $role = $roles[-1] 78 | } 79 | } else { 80 | if ($ToRole) { 81 | if ($roles[0].Name -eq $ToRole) { 82 | $role = $roles[0] 83 | } else { 84 | $role = $null 85 | } 86 | } else { 87 | $role = $roles[0] 88 | } 89 | } 90 | 91 | if (-not $role) { return } 92 | 93 | if (-not $role.ConfigurationSettings) { 94 | $role.InnerXml += "" 95 | } 96 | $ConfigurationSettingsNode = 97 | $(Select-Xml -Xml $role -Namespace $xmlNamespace -XPath '//ServiceDefinition:ConfigurationSettings' | 98 | Select-Object -ExpandProperty Node -First 1) 99 | 100 | $ConfigurationSettingsNode.InnerXml += "" 101 | } elseif ($psCmdlet.ParameterSetName -eq 'SettingTable') { 102 | $null = $psboundParameters.Remove('asString') 103 | $null = $psboundParameters.Remove('setting') 104 | foreach ($kv in $setting.GetEnumerator()) { 105 | $psboundParameters.Name = $kv.Key 106 | $psboundParameters.Value = $kv.Value 107 | $psboundParameters.ServiceDefinition = $ServiceDefinition 108 | $ServiceDefinition = & $myInvocation.MyCommand @psBoundParameters 109 | } 110 | } 111 | } 112 | 113 | end { 114 | if ($AsString) { 115 | $strWrite = New-Object IO.StringWriter 116 | $serviceDefinition.Save($strWrite) 117 | return "$strWrite" 118 | } else { 119 | $serviceDefinition 120 | } 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /Add-AzureStartupTask.ps1: -------------------------------------------------------------------------------- 1 | function Add-AzureStartupTask 2 | { 3 | <# 4 | .Synopsis 5 | Adds a startup task to Azure 6 | .Description 7 | Adds a startup task to an azure service configuration, and packs some extra information into the XML to allow 8 | using ScriptBlock as startup tasks 9 | .Example 10 | New-AzureServiceDefinition -ServiceName "MyService" | 11 | Add-AzureStartupTask -ScriptBlock { "Hello World" } -Elevated -asString 12 | 13 | .Link 14 | Out-AzureService 15 | #> 16 | [OutputType([xml],[string])] 17 | [CmdletBinding(DefaultParameterSetName='CommandLine')] 18 | param( 19 | # The Service Definition XML 20 | [Parameter(Mandatory=$true, 21 | ValueFromPipeline=$true, 22 | ValueFromPipelineByPropertyName=$true)] 23 | [ValidateScript({ 24 | $isServiceDefinition = $_.NameTable.Get("http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition") 25 | if (-not $IsServiceDefinition) { 26 | throw "Input must be a ServiceDefinition XML" 27 | } 28 | return $true 29 | })] 30 | [Xml] 31 | $ServiceDefinition, 32 | 33 | # The role 34 | [string] 35 | $ToRole, 36 | 37 | # The command line to run 38 | [Parameter(Mandatory=$true,ParameterSetName='CommandLine')] 39 | [string] 40 | $CommandLine, 41 | 42 | 43 | # The batch script to run 44 | [Parameter(Mandatory=$true,ParameterSetName='BatchScript')] 45 | [string] 46 | $BatchScript, 47 | 48 | # The ScriptBlock to run. 49 | [Parameter(Mandatory=$true,ParameterSetName='ScriptBlock')] 50 | [ScriptBlock] 51 | $ScriptBlock, 52 | 53 | # The parameter to be passed to the script block 54 | [Parameter(ParameterSetName='ScriptBlock')] 55 | [Hashtable] 56 | $Parameter, 57 | 58 | # The task type. 59 | [ValidateSet('Simple', 'Background', 'Foreground')] 60 | [string] 61 | $TaskType = 'Simple', 62 | 63 | # If set, the task will be run elevated 64 | [switch] 65 | $Elevated, 66 | 67 | # If set, returns the service definition XML up to this point as a string 68 | [switch] 69 | $AsString 70 | ) 71 | 72 | process { 73 | $taskType = $taskType.ToLower() 74 | 75 | # Resolve the role if it set, create the role if it doesn't exist, and track it if they assume the last item. 76 | $roles = @($ServiceDefinition.ServiceDefinition.WebRole), @($ServiceDefinition.ServiceDefinition.WorkerRole) + @($ServiceDefinition.ServiceDefinition.VirtualMachineRole) 77 | $xmlNamespace = @{'ServiceDefinition'='http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition'} 78 | $selectXmlParams = @{ 79 | XPath = '//ServiceDefinition:WebRole|//ServiceDefinition:WorkerRole|//ServiceDefinition:VirtualMachineRole' 80 | Namespace = $xmlNamespace 81 | } 82 | $roles = @(Select-Xml -Xml $ServiceDefinition @selectXmlParams | 83 | Select-Object -ExpandProperty Node) 84 | if (-not $roles) { 85 | $ServiceDefinition = $ServiceDefinition | 86 | Add-AzureRole -RoleName "WebRole1" 87 | 88 | $roles = @(Select-Xml -Xml $ServiceDefinition @selectXmlParams | 89 | Select-Object -ExpandProperty Node) 90 | } 91 | 92 | if ($roles.Count -gt 1) { 93 | if ($ToRole) { 94 | } else { 95 | $role = $roles[-1] 96 | } 97 | } else { 98 | if ($ToRole) { 99 | if ($roles[0].Name -eq $ToRole) { 100 | $role = $roles[0] 101 | } else { 102 | $role = $null 103 | } 104 | } else { 105 | $role = $roles[0] 106 | } 107 | } 108 | 109 | if (-not $role) { return } 110 | 111 | if (-not $role.Startup) { 112 | $role.InnerXml += "" 113 | } 114 | 115 | $startupNode = Select-Xml -Xml $role -Namespace $xmlNamespace -XPath '//ServiceDefinition:Startup' | 116 | Select-Object -ExpandProperty Node -First 1 117 | 118 | $execContext= if ($elevated) { 'elevated' } else { 'limited' } 119 | if ($psCmdlet.ParameterSetName -eq 'CommandLine') { 120 | $startupNode.InnerXml += "" 121 | } elseif ($psCmdlet.ParameterSetName -eq 'ScriptBlock') { 122 | $parameterChunk = if ($parameter) { 123 | $parameterChunk = "" 124 | foreach ($kv in $parameter.GetEnumerator()) { 125 | if ($kv.Value) { 126 | $parameterChunk += "" 127 | } else { 128 | $parameterChunk += "" 129 | } 130 | } 131 | $parameterChunk += "" 132 | } else { ""} 133 | $startupNode.InnerXml += " 134 | 135 | $([Security.SecurityElement]::Escape($ScriptBlock)) 136 | 137 | $parameterChunk 138 | " 139 | } elseif ($psCmdlet.ParameterSetName -eq 'BatchScript') { 140 | $startupNode.InnerXml += " 141 | 142 | $([Security.SecurityElement]::Escape($BatchScript)) 143 | 144 | " 145 | } 146 | 147 | } 148 | 149 | end { 150 | if ($AsString) { 151 | $strWrite = New-Object IO.StringWriter 152 | $serviceDefinition.Save($strWrite) 153 | return "$strWrite" 154 | } else { 155 | $serviceDefinition 156 | } 157 | 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /Add-Deployment.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Add-Deployment.ps1 -------------------------------------------------------------------------------- /Add-EC2.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Add-EC2.ps1 -------------------------------------------------------------------------------- /Add-Interaction.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Add-Interaction.ps1 -------------------------------------------------------------------------------- /Add-SQLTable.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Add-SQLTable.ps1 -------------------------------------------------------------------------------- /Add-SecureSetting.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Add-SecureSetting.ps1 -------------------------------------------------------------------------------- /Assets/Pipeworks_48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Assets/Pipeworks_48.png -------------------------------------------------------------------------------- /Assets/PowerShellPipeworks_150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Assets/PowerShellPipeworks_150.png -------------------------------------------------------------------------------- /Assets/PowerShellPipeworks_30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Assets/PowerShellPipeworks_30.png -------------------------------------------------------------------------------- /Assets/PowerShellPipeworks_310_150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Assets/PowerShellPipeworks_310_150.png -------------------------------------------------------------------------------- /Assets/PowerShellPipeworks_50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Assets/PowerShellPipeworks_50.png -------------------------------------------------------------------------------- /Assets/PowerShellPipeworks_620_300.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Assets/PowerShellPipeworks_620_300.png -------------------------------------------------------------------------------- /CSharp/AddAzureTableCommand.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | using System.Management.Automation; 5 | using System.Net; 6 | using System.IO; 7 | using System.Linq; 8 | using System.Xml.Linq; 9 | using System.Security; 10 | 11 | namespace AzureStorageCmdlets 12 | { 13 | [Cmdlet(VerbsCommon.Add, "AzureTable")] 14 | public class AddAzureTableCommand : AzureTableCmdletBase 15 | { 16 | [Parameter(Mandatory = true, Position=0, ValueFromPipelineByPropertyName = true)] 17 | [Alias("Name")] 18 | public string TableName 19 | { 20 | get; 21 | set; 22 | } 23 | 24 | [Parameter()] 25 | public SwitchParameter PassThru 26 | { 27 | get; 28 | set; 29 | } 30 | 31 | [Parameter(ValueFromPipelineByPropertyName = true)] 32 | public string Author 33 | { 34 | get; 35 | set; 36 | } 37 | 38 | [Parameter(ValueFromPipelineByPropertyName = true)] 39 | public string Email 40 | { 41 | get; 42 | set; 43 | } 44 | 45 | private List CreateTable(string tableName) 46 | { 47 | return Retry>(delegate() 48 | { 49 | HttpWebResponse response; 50 | List tables = new List(); 51 | 52 | try 53 | { 54 | string now = DateTime.UtcNow.ToString("o"); 55 | 56 | string requestBody = String.Format("" + 57 | " " + 60 | " " + 61 | " <updated>" + now + "</updated> " + 62 | " <author>" + 63 | " <name/> " + 64 | " </author> " + 65 | " <id/> " + 66 | " <content type=\"application/xml\">" + 67 | " <m:properties>" + 68 | " <d:TableName>{0}</d:TableName>" + 69 | " </m:properties>" + 70 | " </content> " + 71 | "</entry>", 72 | tableName); 73 | 74 | if (! String.IsNullOrEmpty(Author)) { 75 | if (!String.IsNullOrEmpty(Email)) { 76 | requestBody.Replace("<name/>", ("<name>" + SecurityElement.Escape(Author) + "</name><email>" + SecurityElement.Escape(Email) + "</email>")); 77 | } else { 78 | requestBody.Replace("<name/>", ("<name>" + SecurityElement.Escape(Author) + "</name>")); 79 | } 80 | 81 | } 82 | response = CreateRESTRequest("POST", "Tables", requestBody, null, null, null).GetResponse() as HttpWebResponse; 83 | if (response.StatusCode == HttpStatusCode.Created) 84 | { 85 | using (StreamReader reader = new StreamReader(response.GetResponseStream())) 86 | { 87 | string result = reader.ReadToEnd(); 88 | 89 | XNamespace ns = "http://www.w3.org/2005/Atom"; 90 | XNamespace d = "http://schemas.microsoft.com/ado/2007/08/dataservices"; 91 | 92 | XElement x = XElement.Parse(result, LoadOptions.SetBaseUri); 93 | foreach (XElement table in x.Descendants(ns + "entry")) 94 | { 95 | AzureTable tableOutput = new AzureTable(); 96 | tableOutput.TableId = new Uri(table.Descendants(ns + "id").First().Value); 97 | tableOutput.TableName = table.Descendants(d + "TableName").First().Value; 98 | tableOutput.Updated = (DateTime)LanguagePrimitives.ConvertTo((table.Descendants(ns + "updated").First().Value), DateTime.Now.GetType()); 99 | tables.Add(tableOutput); 100 | } 101 | } 102 | } 103 | response.Close(); 104 | 105 | return tables; 106 | } 107 | catch (WebException ex) 108 | { 109 | if (ex.Status == WebExceptionStatus.ProtocolError && 110 | ex.Response != null && 111 | (int)(ex.Response as HttpWebResponse).StatusCode == 409) 112 | return null; 113 | 114 | throw; 115 | } 116 | }); 117 | } 118 | 119 | protected override void ProcessRecord() 120 | { 121 | // Calling the base processrecord 122 | base.ProcessRecord(); 123 | if (String.IsNullOrEmpty(StorageAccount) || String.IsNullOrEmpty(StorageKey)) { return; } 124 | 125 | if (PassThru) 126 | { 127 | this.WriteObject(CreateTable(TableName), true); 128 | } 129 | else 130 | { 131 | CreateTable(TableName); 132 | } 133 | 134 | } 135 | } 136 | } 137 | -------------------------------------------------------------------------------- /CSharp/GetAzureTableCommand.cs: -------------------------------------------------------------------------------- 1 | namespace AzureStorageCmdlets 2 | { 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Text; 6 | using System.Net; 7 | using System.IO; 8 | using System.Management.Automation; 9 | using System.Linq; 10 | using System.Xml.Linq; 11 | 12 | public class AzureTable 13 | { 14 | public Uri TableId 15 | { 16 | get; 17 | set; 18 | } 19 | 20 | public DateTime Updated 21 | { 22 | get; 23 | set; 24 | } 25 | 26 | public string TableName 27 | { 28 | get; 29 | set; 30 | } 31 | } 32 | 33 | 34 | [Cmdlet(VerbsCommon.Get, "AzureTable", DefaultParameterSetName="GetATable")] 35 | public class GetAzureTableCommand : AzureTableCmdletBase 36 | { 37 | [Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true, Position=0,ParameterSetName = "GetSpecificItem")] 38 | [Parameter(ValueFromPipelineByPropertyName = true, Position=0,ParameterSetName = "GetATable")] 39 | [Alias(new string[] { "Name", "Table" })] 40 | public string TableName 41 | { 42 | get; 43 | set; 44 | } 45 | 46 | [Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true, Position=1,ParameterSetName = "GetSpecificItem")] 47 | [Alias(new string[] { "TablePart", "TablePartition", "PartitionKey" })] 48 | public string Partition 49 | { 50 | get; 51 | set; 52 | } 53 | 54 | [Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true, Position=2,ParameterSetName = "GetSpecificItem")] 55 | [Alias(new string[] { "TableRow", "RowKey" })] 56 | public string Row 57 | { 58 | get; 59 | set; 60 | } 61 | 62 | [Parameter()] 63 | public SwitchParameter ExcludeTableInfo 64 | { 65 | get; 66 | set; 67 | } 68 | 69 | private List<AzureTable> ListTables() 70 | { 71 | return Retry<List<AzureTable>>(delegate() 72 | { 73 | HttpWebResponse response; 74 | List<AzureTable> tables = new List<AzureTable>(); 75 | 76 | tables = new List<AzureTable>(); 77 | 78 | try 79 | { 80 | response = CreateRESTRequest("GET", "Tables", String.Empty, null, String.Empty, String.Empty).GetResponse() as HttpWebResponse; 81 | 82 | if ((int)response.StatusCode == 200) 83 | { 84 | using (StreamReader reader = new StreamReader(response.GetResponseStream())) 85 | { 86 | string result = reader.ReadToEnd(); 87 | 88 | XNamespace ns = "http://www.w3.org/2005/Atom"; 89 | XNamespace d = "http://schemas.microsoft.com/ado/2007/08/dataservices"; 90 | 91 | XElement x = XElement.Parse(result, LoadOptions.SetBaseUri); 92 | 93 | foreach (XElement table in x.Descendants(ns + "entry")) 94 | { 95 | AzureTable tableOutput = new AzureTable(); 96 | tableOutput.TableId = new Uri(table.Descendants(ns + "id").First().Value); 97 | tableOutput.TableName = table.Descendants(d + "TableName").First().Value; 98 | tableOutput.Updated = (DateTime)LanguagePrimitives.ConvertTo((table.Descendants(ns + "updated").First().Value), DateTime.Now.GetType()); 99 | tables.Add(tableOutput); 100 | } 101 | } 102 | } 103 | 104 | response.Close(); 105 | 106 | return tables; 107 | } 108 | catch (WebException ex) 109 | { 110 | if (ex.Status == WebExceptionStatus.ProtocolError && 111 | ex.Response != null && 112 | (int)(ex.Response as HttpWebResponse).StatusCode == 404) 113 | return null; 114 | 115 | throw; 116 | } 117 | }); 118 | } 119 | 120 | // Retrieve an entity. Returns entity XML. 121 | // Return true on success, false if not found, throw exception on error. 122 | 123 | private string GetEntity(string tableName, string partitionKey, string rowKey) 124 | { 125 | return Retry<string>(delegate() 126 | { 127 | HttpWebRequest request; 128 | HttpWebResponse response; 129 | 130 | string entityXml = null; 131 | 132 | try 133 | { 134 | string resource = String.Format(tableName + "(PartitionKey='{0}',RowKey='{1}')", partitionKey, rowKey); 135 | 136 | SortedList<string, string> headers = new SortedList<string, string>(); 137 | headers.Add("If-Match", "*"); 138 | 139 | request = CreateRESTRequest("GET", resource, null, headers, String.Empty, String.Empty); 140 | 141 | request.Accept = "application/atom+xml"; 142 | 143 | response = request.GetResponse() as HttpWebResponse; 144 | 145 | if ((int)response.StatusCode == 200) 146 | { 147 | using (StreamReader reader = new StreamReader(response.GetResponseStream())) 148 | { 149 | string result = reader.ReadToEnd(); 150 | if (! String.IsNullOrEmpty(result)) { 151 | XNamespace ns = "http://www.w3.org/2005/Atom"; 152 | XNamespace d = "http://schemas.microsoft.com/ado/2007/08/dataservices"; 153 | 154 | XElement entry = XElement.Parse(result); 155 | 156 | entityXml = entry.ToString(); 157 | } 158 | 159 | } 160 | } 161 | 162 | response.Close(); 163 | 164 | return entityXml; 165 | } 166 | catch (WebException ex) 167 | { 168 | if (ex.Status == WebExceptionStatus.ProtocolError && 169 | ex.Response != null) 170 | { 171 | WriteWebError(ex, tableName + ":" + partitionKey + ":" + rowKey); 172 | return String.Empty; 173 | } 174 | return String.Empty; 175 | } 176 | }); 177 | } 178 | 179 | 180 | 181 | protected override void ProcessRecord() 182 | { 183 | base.ProcessRecord(); 184 | if (String.IsNullOrEmpty(StorageAccount) || String.IsNullOrEmpty(StorageKey)) { return; } 185 | if (this.ParameterSetName == "GetATable") 186 | { 187 | if (String.IsNullOrEmpty(this.TableName)) { 188 | WriteObject(ListTables(), true); 189 | } else { 190 | foreach (AzureTable at in ListTables()) { 191 | if (this.TableName.Contains('?') || this.TableName.Contains('*')) { 192 | WildcardPattern wp = new WildcardPattern(this.TableName); 193 | if (wp.IsMatch(at.TableName)) { 194 | WriteObject(at); 195 | } 196 | } else { 197 | if (String.Compare(at.TableName, this.TableName, StringComparison.InvariantCultureIgnoreCase) == 0) { 198 | WriteObject(at); 199 | } 200 | } 201 | 202 | } 203 | } 204 | } else if (this.ParameterSetName == "GetSpecificItem") { 205 | string itemXml = GetEntity(this.TableName, this.Partition, this.Row); 206 | WriteObject(ExpandObject(itemXml, (!ExcludeTableInfo), this.TableName), true); 207 | } 208 | } 209 | } 210 | } 211 | -------------------------------------------------------------------------------- /CSharp/RemoveAzureTableCommand.cs: -------------------------------------------------------------------------------- 1 | namespace AzureStorageCmdlets 2 | { 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Text; 6 | using System.Management.Automation; 7 | using System.Net; 8 | using System.IO; 9 | using System.Linq; 10 | using System.Xml.Linq; 11 | 12 | [Cmdlet(VerbsCommon.Remove, "AzureTable", ConfirmImpact=ConfirmImpact.High, SupportsShouldProcess=true)] 13 | public class RemoveAzureTableCommand : AzureTableCmdletBase 14 | { 15 | #region Parameters 16 | 17 | [Parameter(Mandatory = true, Position=0,ValueFromPipelineByPropertyName = true)] 18 | [Alias("Name")] 19 | public string TableName 20 | { 21 | get; 22 | set; 23 | } 24 | 25 | [Parameter(Position=1,ValueFromPipelineByPropertyName = true)] 26 | public string PartitionKey 27 | { 28 | get; 29 | set; 30 | } 31 | 32 | [Parameter(Position=2,ValueFromPipelineByPropertyName = true)] 33 | public string RowKey 34 | { 35 | get; 36 | set; 37 | } 38 | 39 | #endregion 40 | 41 | private bool DeleteTable(string tableName) 42 | { 43 | return Retry<bool>(delegate() 44 | { 45 | HttpWebResponse response; 46 | List<AzureTable> tables = new List<AzureTable>(); 47 | try 48 | { 49 | response = CreateRESTRequest("DELETE", "Tables('" + tableName + "')", String.Empty, null, String.Empty, String.Empty).GetResponse() as HttpWebResponse; 50 | response.Close(); 51 | 52 | return true; 53 | } 54 | catch (WebException ex) 55 | { 56 | if (ex.Status == WebExceptionStatus.ProtocolError && 57 | ex.Response != null && 58 | (int)(ex.Response as HttpWebResponse).StatusCode == 409) 59 | return false; 60 | 61 | throw; 62 | } 63 | }); 64 | } 65 | 66 | public bool DeleteEntity(string tableName, string partitionKey, string rowKey) 67 | { 68 | return Retry<bool>(delegate() 69 | { 70 | HttpWebRequest request; 71 | HttpWebResponse response; 72 | 73 | try 74 | { 75 | string resource = String.Format(tableName + "(PartitionKey='{0}',RowKey='{1}')", partitionKey, rowKey); 76 | 77 | SortedList<string, string> headers = new SortedList<string, string>(); 78 | headers.Add("If-Match", "*"); 79 | 80 | request = CreateRESTRequest("DELETE", resource, null, headers, String.Empty, String.Empty); 81 | 82 | response = request.GetResponse() as HttpWebResponse; 83 | response.Close(); 84 | 85 | return true; 86 | } 87 | catch (WebException ex) 88 | { 89 | if (ex.Status == WebExceptionStatus.ProtocolError && 90 | ex.Response != null && 91 | (int)(ex.Response as HttpWebResponse).StatusCode == 409) 92 | return false; 93 | 94 | throw; 95 | } 96 | }); 97 | } 98 | 99 | protected override void ProcessRecord() 100 | { 101 | 102 | base.ProcessRecord(); 103 | if (String.IsNullOrEmpty(StorageAccount) || String.IsNullOrEmpty(StorageKey)) { return; } 104 | 105 | if (this.MyInvocation.BoundParameters.ContainsKey("TableName") && 106 | this.MyInvocation.BoundParameters.ContainsKey("PartitionKey") && this.MyInvocation.BoundParameters.ContainsKey("RowKey")) { 107 | if (this.ShouldProcess(TableName + "/" + PartitionKey + "/" + RowKey)) 108 | { 109 | DeleteEntity(TableName, PartitionKey, RowKey); 110 | } 111 | } else if (this.MyInvocation.BoundParameters.ContainsKey("TableName") && 112 | this.MyInvocation.BoundParameters.ContainsKey("PartitionKey")) { 113 | // Name and Partition if (this.ShouldProcess(TableName + "/" + PartitionKey)) { } 114 | } else { // Just Name 115 | if (this.ShouldProcess(TableName)) 116 | { 117 | DeleteTable(TableName); 118 | } 119 | } 120 | } 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /CSharp/SetAzureTableCommand.cs: -------------------------------------------------------------------------------- 1 | namespace AzureStorageCmdlets 2 | { 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Text; 6 | using System.Management.Automation; 7 | using System.Net; 8 | using System.IO; 9 | using System.Linq; 10 | using System.Xml.Linq; 11 | using System.Security; 12 | using System.Reflection; 13 | 14 | [Cmdlet(VerbsCommon.Set, "AzureTable", SupportsShouldProcess=true)] 15 | public class SetAzureTableCommand : AzureTableCmdletBase 16 | { 17 | [Parameter(Mandatory = true, ValueFromPipelineByPropertyName=true)] 18 | [Alias("Name")] 19 | public string TableName 20 | { 21 | get; 22 | set; 23 | } 24 | 25 | [Parameter(ValueFromPipelineByPropertyName=true)] 26 | [Alias(new string[] { "TablePart", "TablePartition", "Partition" })] 27 | public string PartitionKey 28 | { 29 | get; 30 | set; 31 | } 32 | 33 | [Parameter(ValueFromPipelineByPropertyName=true)] 34 | [Alias(new string[] { "TableRow", "Row"})] 35 | public string RowKey 36 | { 37 | get; 38 | set; 39 | } 40 | 41 | [Parameter(Mandatory=true,Position=0,ValueFromPipeline=true)] 42 | public PSObject InputObject 43 | { 44 | get; 45 | set; 46 | } 47 | 48 | 49 | [Parameter()] 50 | public SwitchParameter PassThru 51 | { 52 | get; 53 | set; 54 | } 55 | 56 | [Parameter(ValueFromPipelineByPropertyName=true)] 57 | public string Author 58 | { 59 | get; 60 | set; 61 | } 62 | 63 | [Parameter(ValueFromPipelineByPropertyName=true)] 64 | public string Email 65 | { 66 | get; 67 | set; 68 | } 69 | 70 | [Parameter()] 71 | public SwitchParameter ExcludeTableInfo 72 | { 73 | get; 74 | set; 75 | } 76 | 77 | 78 | [Parameter()] 79 | public int StartAtRow 80 | { 81 | get { return rowNumber; } 82 | set { rowNumber = value; } 83 | } 84 | 85 | int rowNumber = 0; 86 | protected override void ProcessRecord() 87 | { 88 | base.ProcessRecord(); 89 | if (String.IsNullOrEmpty(StorageAccount) || String.IsNullOrEmpty(StorageKey)) { return; } 90 | if (! (this.MyInvocation.BoundParameters.ContainsKey("RowKey"))) 91 | { 92 | RowKey = this.rowNumber.ToString(); 93 | rowNumber++; 94 | } 95 | if (!(this.MyInvocation.BoundParameters.ContainsKey("PartitionKey"))) 96 | { 97 | PartitionKey = "Default"; 98 | } 99 | if (this.ShouldProcess(this.TableName + "/" + this.PartitionKey + "/" + this.RowKey)) { 100 | if (PassThru) 101 | { 102 | WriteObject( 103 | InsertEntity(this.TableName, this.PartitionKey, this.RowKey, this.InputObject, this.Author, this.Email, false, false, ExcludeTableInfo), 104 | true); 105 | } 106 | else 107 | { 108 | InsertEntity(this.TableName, this.PartitionKey, this.RowKey, this.InputObject, this.Author, this.Email, false, false, true); 109 | } 110 | } 111 | } 112 | } 113 | } 114 | -------------------------------------------------------------------------------- /CSharp/UpdateAzureTableCommand.cs: -------------------------------------------------------------------------------- 1 | namespace AzureStorageCmdlets 2 | { 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Text; 6 | using System.Management.Automation; 7 | using System.Net; 8 | using System.IO; 9 | using System.Linq; 10 | using System.Xml.Linq; 11 | using System.Security; 12 | using System.Reflection; 13 | 14 | [Cmdlet(VerbsData.Update, "AzureTable")] 15 | public class UpdateAzureTableCommand: AzureTableCmdletBase 16 | { 17 | [Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true)] 18 | [Alias("Name")] 19 | public string TableName 20 | { 21 | get; 22 | set; 23 | } 24 | 25 | [Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true)] 26 | [Alias(new string[] { "TablePart", "TablePartition"})] 27 | public string PartitionKey 28 | { 29 | get; 30 | set; 31 | } 32 | 33 | [Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true)] 34 | [Alias(new string[] { "TableRow"})] 35 | public string RowKey 36 | { 37 | get; 38 | set; 39 | } 40 | 41 | [Parameter(Mandatory = true, Position = 0, ValueFromPipeline=true, ValueFromPipelineByPropertyName = true)] 42 | public PSObject Value 43 | { 44 | get; 45 | set; 46 | } 47 | 48 | 49 | [Parameter()] 50 | public SwitchParameter PassThru 51 | { 52 | get; 53 | set; 54 | } 55 | 56 | [Parameter()] 57 | public string Author 58 | { 59 | get; 60 | set; 61 | } 62 | 63 | [Parameter()] 64 | public string Email 65 | { 66 | get; 67 | set; 68 | } 69 | 70 | [Parameter()] 71 | public SwitchParameter Merge 72 | { 73 | get; 74 | set; 75 | } 76 | 77 | protected override void ProcessRecord() 78 | { 79 | base.ProcessRecord(); 80 | if (String.IsNullOrEmpty(StorageAccount) || String.IsNullOrEmpty(StorageKey)) { return; } 81 | InsertEntity(this.TableName, this.PartitionKey, this.RowKey, this.Value, this.Author, this.Email, true, Merge, true); 82 | } 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /Close-Port.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Close-Port.ps1 -------------------------------------------------------------------------------- /Compress-Data.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Compress-Data.ps1 -------------------------------------------------------------------------------- /Confirm-Person.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Confirm-Person.ps1 -------------------------------------------------------------------------------- /Connect-EC2.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Connect-EC2.ps1 -------------------------------------------------------------------------------- /ConvertFrom-InlinePowerShell.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/ConvertFrom-InlinePowerShell.ps1 -------------------------------------------------------------------------------- /ConvertFrom-Markdown.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/ConvertFrom-Markdown.ps1 -------------------------------------------------------------------------------- /ConvertTo-DataTable.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/ConvertTo-DataTable.ps1 -------------------------------------------------------------------------------- /ConvertTo-ModuleService.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/ConvertTo-ModuleService.ps1 -------------------------------------------------------------------------------- /ConvertTo-ServiceUrl.ps1: -------------------------------------------------------------------------------- 1 | function ConvertTo-ServiceUrl 2 | { 3 | <# 4 | .Synopsis 5 | Converts parameters into a full URL for a Pipeworks Service 6 | .Description 7 | Converts parameters into a full URL for a Pipeworks web service. 8 | 9 | This allows you to easily call another a Pipeworks web service with a uniform URL. 10 | 11 | This can work because all Pipeworks services have a very uniform URL format: 12 | 13 | ServiceUrl/Command/?Command_Parameter1=Value&Command_Parameter2=Value 14 | .Example 15 | ConvertTo-ServiceUrl -ServiceUrl "http://powershellpipeworks.com/" -CommandName "Write-ScriptHTML" -Parameter @{ 16 | Text = "'hello world'" 17 | } 18 | .Link 19 | ConvertTo-ModuleService 20 | #> 21 | [OutputType([string])] 22 | param( 23 | # The root URL of the web service 24 | [Parameter(Position=0,ValueFromPipelineByPropertyName=$true)] 25 | [Uri] 26 | $ServiceUrl, 27 | 28 | # The name of the command in the Pipeworks module. 29 | [Parameter(Mandatory=$true,Position=1,ValueFromPipelineByPropertyName=$true)] 30 | [string] 31 | $CommandName, 32 | 33 | # The name of the command in the Pipeworks module. 34 | [Parameter(Mandatory=$true,Position=2,ValueFromPipelineByPropertyName=$true)] 35 | [Alias('Parameters')] 36 | [Hashtable] 37 | $Parameter, 38 | 39 | # If set, will get a URL to return the XML 40 | [switch] 41 | $AsXml 42 | ) 43 | 44 | process { 45 | #region Create a GET string 46 | # Carry over the parameters 47 | $actionUrl = foreach ($kv in $Parameter.GetEnumerator()) { 48 | "${CommandName}_$($kv.Key)=$([Web.HttpUtility]::UrlEncode($kv.Value))" 49 | } 50 | 51 | $actionUrl = "/${CommandName}/?" + ($actionUrl -join '&') 52 | #endregion Create a GET string 53 | 54 | if ($AsXml) { 55 | $actionUrl += "&AsXml=true" 56 | } 57 | if ($ServiceUrl) { 58 | $actionUrl = "$ServiceUrl".TrimEnd("/") + $actionUrl 59 | } 60 | 61 | $actionUrl 62 | } 63 | } -------------------------------------------------------------------------------- /Enable-EC2Remoting.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Enable-EC2Remoting.ps1 -------------------------------------------------------------------------------- /Expand-Data.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Expand-Data.ps1 -------------------------------------------------------------------------------- /Expand-Zip.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Expand-Zip.ps1 -------------------------------------------------------------------------------- /Export-DataTable.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Export-DataTable.ps1 -------------------------------------------------------------------------------- /Export-PSData.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Export-PSData.ps1 -------------------------------------------------------------------------------- /Get-Ami.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Get-Ami.ps1 -------------------------------------------------------------------------------- /Get-Bootstrapped.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Get-Bootstrapped.ps1 -------------------------------------------------------------------------------- /Get-Deployment.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Get-Deployment.ps1 -------------------------------------------------------------------------------- /Get-EC2.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Get-EC2.ps1 -------------------------------------------------------------------------------- /Get-EC2AvailabilityZone.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Get-EC2AvailabilityZone.ps1 -------------------------------------------------------------------------------- /Get-EC2InstancePassword.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Get-EC2InstancePassword.ps1 -------------------------------------------------------------------------------- /Get-EC2KeyPair.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Get-EC2KeyPair.ps1 -------------------------------------------------------------------------------- /Get-EC2SecurityGroup.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Get-EC2SecurityGroup.ps1 -------------------------------------------------------------------------------- /Get-Email.old.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Get-Email.old.ps1 -------------------------------------------------------------------------------- /Get-Email.ps1: -------------------------------------------------------------------------------- 1 | function Get-Email 2 | { 3 | <# 4 | .Synopsis 5 | Gets email from exchange 6 | .Description 7 | Gets email from an exchange server 8 | .Link 9 | Invoke-Office365 10 | .Example 11 | Get-Email 12 | #> 13 | [OutputType([PSObject])] 14 | [CmdletBinding(DefaultParameterSetName='UserNameAndPasswordSetting')] 15 | param( 16 | # The account 17 | [Parameter(Mandatory=$true,ParameterSetName='SpecificAccount')] 18 | [Management.Automation.PSCredential] 19 | $Account, 20 | 21 | # The setting containing the username 22 | [Parameter(ParameterSetName='UserNameAndPasswordSetting')] 23 | [string] 24 | $UserNameSetting = 'Office365Username', 25 | 26 | # The setting containing the password 27 | [Parameter(ParameterSetName='UserNameAndPasswordSetting')] 28 | [string] 29 | $PasswordSetting = 'Office365Password', 30 | 31 | # The email account to connect to retreive data from. If not specified, email will be retreived for the account used to connect. 32 | [Parameter(ValueFromPipelineByPropertyName=$true)] 33 | [string] 34 | $Email, 35 | 36 | # If set, will only return unread messages 37 | [Parameter(ValueFromPipelineByPropertyName=$true)] 38 | [Switch] 39 | $Unread, 40 | 41 | # The name of the contact the email was sent to. This the displayed name, not a full email address 42 | [Parameter(ValueFromPipelineByPropertyName=$true)] 43 | [string] 44 | $To, 45 | 46 | # The email that sent the message 47 | [Parameter(ValueFromPipelineByPropertyName=$true)] 48 | [string] 49 | $From, 50 | 51 | # If set, will download the email content, not just the headers 52 | [Parameter(ValueFromPipelineByPropertyName=$true)] 53 | [Switch] 54 | $Download 55 | ) 56 | 57 | begin { 58 | $wsPath = $MyInvocation.MyCommand.ScriptBlock.File | 59 | Split-Path | 60 | Get-ChildItem -Filter bin | 61 | Get-ChildItem -Filter Microsoft.Exchange.WebServices.dll 62 | 63 | $ra = Add-Type -Path $wspath.FullName -PassThru | Select-Object -ExpandProperty Assembly -Unique | Select-Object -ExpandProperty Location 64 | 65 | Add-Type -ReferencedAssemblies $ra -TypeDefinition @' 66 | using System; 67 | using System.Collections.Generic; 68 | using System.Linq; 69 | using System.Text; 70 | using Microsoft.Exchange.WebServices.Data; 71 | using System.Net.Security; 72 | using System.Net; 73 | using Microsoft.Exchange.WebServices.Autodiscover; 74 | using System.Configuration; 75 | 76 | public class Office365EWSHelper2 77 | { 78 | /// <summary> 79 | /// Bind to Mailbox via AutoDiscovery 80 | /// </summary> 81 | /// <returns>Exchange Service object</returns> 82 | public static ExchangeService GetBinding(WebCredentials credentials, string lookupEmail) 83 | { 84 | // Create the binding. 85 | ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP1); 86 | 87 | // Define credentials. 88 | service.Credentials = credentials; 89 | 90 | // Use the AutodiscoverUrl method to locate the service endpoint. 91 | service.AutodiscoverUrl(lookupEmail, RedirectionUrlValidationCallback); 92 | return service; 93 | } 94 | 95 | 96 | // Create the callback to validate the redirection URL. 97 | static bool RedirectionUrlValidationCallback(String redirectionUrl) 98 | { 99 | // Perform validation. 100 | return true; // (redirectionUrl == "https://autodiscover-s.outlook.com/autodiscover/autodiscover.xml"); 101 | } 102 | 103 | } 104 | 105 | '@ 106 | 107 | 108 | 109 | } 110 | process { 111 | if ($Account) { 112 | $Cred = $Account 113 | } elseif ($UserNameSetting -and $PasswordSetting) { 114 | $cred = New-Object Management.Automation.PSCredential (Get-SecureSetting $UserNameSetting -ValueOnly), 115 | (ConvertTo-SecureString -AsPlainText -Force (Get-SecureSetting $PasswordSetting -ValueOnly)) 116 | } 117 | 118 | if (-not $script:ewsForUser) { 119 | $script:ewsForUser = @{} 120 | } 121 | $ForEmail = if ($Email) { 122 | $Email 123 | } else { 124 | $cred.UserName 125 | } 126 | if (-not $ewsForUser["${ForEmail}_AS_$($Cred.UserName)"]) { 127 | 128 | $ews = [Office365EwsHelper2]::GetBinding($cred.GetNetworkCredential(), $ForEmail) 129 | $script:ewsForUser["${ForEmail}_AS_$($Cred.UserName)"] = $ews 130 | } else { 131 | $ews = $script:ewsForUser["${ForEmail}_AS_$($Cred.UserName)"] 132 | } 133 | 134 | $coll =New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+SearchFilterCollection 135 | 136 | if ($Unread) { 137 | $unreadFilter = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo -Property @{PropertyDefinition=[Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::IsRead;Value='false'} 138 | $coll.add($unreadFilter) 139 | } 140 | 141 | if ($To) { 142 | if ($to -notlike "*@.*") { 143 | $toEmail = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+ContainsSubstring -Property @{PropertyDefinition=[Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::DisplayTo;Value=$To} 144 | $coll.add($toEmail) 145 | 146 | 147 | } else { 148 | $toEmail = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+ContainsSubstring -Property @{PropertyDefinition=[Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::DisplayTo;Value=$To} 149 | $coll.add($toEmail) 150 | } 151 | 152 | } 153 | 154 | if ($From) { 155 | $fromEmail = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo -Property @{PropertyDefinition=[Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::From;Value=$From} 156 | $coll.add($fromEmail ) 157 | 158 | } 159 | 160 | 161 | 162 | $fid = New-Object Microsoft.Exchange.WebServices.Data.FolderId "Inbox", $ForEmail 163 | $iv = New-Object Microsoft.Exchange.WebServices.Data.ItemView 1000 164 | $fiItems = $null 165 | do{ 166 | 167 | if ($coll.Count) { 168 | $fiItems = $ews.FindItems($fid , $coll, $iv) 169 | } else { 170 | $fiItems = $ews.FindItems($fid , "", $iv) 171 | } 172 | 173 | foreach ($Item in $fiItems) { 174 | if ($Download) { 175 | $item.load() 176 | } 177 | 178 | if ($item.From.RoutingType -eq 'EX') { 179 | $_ = $_ 180 | $emails = $ews.ResolveName($item.From.Name, "DirectoryOnly", $true) | ForEach-Object { $_.Mailbox } | ForEach-Object{ $_.GetSearchString() } 181 | $emails = $emails -join ',' 182 | $item | 183 | Add-Member NoteProperty FromEmail $emails 184 | } else { 185 | $item | 186 | Add-Member NoteProperty FromEmail $item.From.Address 187 | } 188 | $Item 189 | } 190 | $iv.offset += $fiItems.Items.Count 191 | }while($fiItems.MoreAvailable -eq $true) 192 | 193 | } 194 | } -------------------------------------------------------------------------------- /Get-FunctionFromScript.ps1: -------------------------------------------------------------------------------- 1 | function Get-FunctionFromScript { 2 | <# 3 | .Synopsis 4 | Gets the functions declared within a script block or a file 5 | .Description 6 | Gets the functions exactly as they are written within a script or file 7 | .Example 8 | Get-FunctionFromScript { 9 | function foo() { 10 | "foo" 11 | } 12 | function bar() { 13 | "bar" 14 | } 15 | } 16 | .Link 17 | http://powershellpipeworks.com/ 18 | #> 19 | [CmdletBinding(DefaultParameterSetName='File')] 20 | [OutputType([ScriptBlock], [PSObject])] 21 | param( 22 | # The script block containing functions 23 | [Parameter(Mandatory=$true, 24 | Position=0, 25 | ParameterSetName="ScriptBlock", 26 | ValueFromPipelineByPropertyName=$true)] 27 | [ScriptBlock] 28 | $ScriptBlock, 29 | 30 | # A file containing functions 31 | [Parameter(Mandatory=$true, 32 | ParameterSetName="File", 33 | ValueFromPipelineByPropertyName=$true)] 34 | [Alias('FullName')] 35 | [String] 36 | $File, 37 | 38 | # If set, outputs the command metadatas 39 | [switch] 40 | $OutputMetaData 41 | ) 42 | 43 | process { 44 | if ($psCmdlet.ParameterSetName -eq "File") { 45 | #region Resolve the file, create a script block, and pass the data down 46 | $realFile = Get-Item $File 47 | if (-not $realFile) { 48 | $realFile = Get-Item -LiteralPath $File -ErrorAction SilentlyContinue 49 | if (-not $realFile) { 50 | return 51 | } 52 | } 53 | $text = [IO.File]::ReadAllText($realFile.Fullname) 54 | $scriptBlock = [ScriptBlock]::Create($text) 55 | if ($scriptBlock) { 56 | $functionsInScript = 57 | Get-FunctionFromScript -ScriptBlock $scriptBlock -OutputMetaData:$OutputMetaData 58 | if ($OutputMetaData) 59 | { 60 | $functionsInScript | 61 | Add-Member NoteProperty File $realFile.FullName -PassThru 62 | } 63 | } 64 | #endregion Resolve the file, create a script block, and pass the data down 65 | } elseif ($psCmdlet.ParameterSetName -eq "ScriptBlock") { 66 | #region Extract out core functions from a Script Block 67 | $text = $scriptBlock.ToString() 68 | $tokens = [Management.Automation.PSParser]::Tokenize($scriptBlock, [ref]$null) 69 | for ($i = 0; $i -lt $tokens.Count; $i++) { 70 | if ($tokens[$i].Content -eq "function" -and 71 | $tokens[$i].Type -eq "Keyword") { 72 | $groupDepth = 0 73 | $functionName = $tokens[$i + 1].Content 74 | $ii = $i 75 | $done = $false 76 | while (-not $done) { 77 | while ($tokens[$ii] -and $tokens[$ii].Type -ne 'GroupStart') { $ii++ } 78 | $groupDepth++ 79 | while ($groupDepth -and $tokens[$ii]) { 80 | $ii++ 81 | if ($tokens[$ii].Type -eq 'GroupStart') { $groupDepth++ } 82 | if ($tokens[$ii].Type -eq 'GroupEnd') { $groupDepth-- } 83 | } 84 | if (-not $tokens[$ii]) { break } 85 | if ($tokens[$ii].Content -eq "}") { 86 | $done = $true 87 | } 88 | } 89 | if (-not $tokens[$ii] -or 90 | ($tokens[$ii].Start + $tokens[$ii].Length) -ge $Text.Length) { 91 | $chunk = $text.Substring($tokens[$i].Start) 92 | } else { 93 | $chunk = $text.Substring($tokens[$i].Start, 94 | $tokens[$ii].Start + $tokens[$ii].Length - $tokens[$i].Start) 95 | } 96 | if ($OutputMetaData) { 97 | New-Object PSObject -Property @{ 98 | Name = $functionName 99 | Definition = [ScriptBlock]::Create($chunk) 100 | } 101 | } else { 102 | [ScriptBlock]::Create($chunk) 103 | } 104 | } 105 | } 106 | #endregion Extract out core functions from a Script Block 107 | } 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /Get-Hash.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Get-Hash.ps1 -------------------------------------------------------------------------------- /Get-Paid.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Get-Paid.ps1 -------------------------------------------------------------------------------- /Get-PhoneCall.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Get-PhoneCall.ps1 -------------------------------------------------------------------------------- /Get-PipeworksManifest.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Get-PipeworksManifest.ps1 -------------------------------------------------------------------------------- /Get-SQLTable.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Get-SQLTable.ps1 -------------------------------------------------------------------------------- /Get-SecureSetting.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Get-SecureSetting.ps1 -------------------------------------------------------------------------------- /Get-TextMessage.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Get-TextMessage.ps1 -------------------------------------------------------------------------------- /Get-Translation.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Get-Translation.ps1 -------------------------------------------------------------------------------- /Get-Walkthru.ps1: -------------------------------------------------------------------------------- 1 | function Get-Walkthru { 2 | <# 3 | .Synopsis 4 | Gets information from a file as a walkthru 5 | .Description 6 | Parses walkthru steps from a walkthru file. 7 | Walkthru files contain step-by-step examples for using PowerShell. 8 | .Link 9 | Write-WalkthruHTML 10 | .Example 11 | Get-Walkthru -Text { 12 | # Walkthrus are just scripts with comments that start at column 0. 13 | 14 | 15 | # Step 1: 16 | Get-Process 17 | 18 | #Step 2: 19 | Get-Command 20 | } 21 | #> 22 | [CmdletBinding(DefaultParameterSetName="File")] 23 | [OutputType([PSObject])] 24 | param( 25 | # The command used to generate walkthrus 26 | [Parameter(Mandatory=$true, 27 | ParameterSetName="Command", 28 | ValueFromPipeline=$true)] 29 | [Management.Automation.CommandInfo] 30 | $Command, 31 | 32 | # The module containing walkthrus 33 | [Parameter(Mandatory=$true, 34 | ParameterSetName="Module", 35 | ValueFromPipeline=$true)] 36 | [Management.Automation.PSModuleInfo] 37 | $Module, 38 | 39 | # The file used to generate walkthrus 40 | [Parameter(Mandatory=$true, 41 | ParameterSetName="File", 42 | ValueFromPipelineByPropertyName=$true)] 43 | [Alias('Fullname')] 44 | [string]$File, 45 | 46 | # The text used to generate walkthrus 47 | [Parameter(Mandatory=$true, 48 | ParameterSetName="Text")] 49 | [String]$Text, 50 | 51 | # The script block used to generate a walkthru 52 | [Parameter(Mandatory=$true, 53 | ParameterSetName="ScriptBlock")] 54 | [ScriptBlock]$ScriptBlock 55 | ) 56 | 57 | begin { 58 | $err = $null 59 | #region Create walkthru type if it doesn't exist 60 | if (-not ('PSWalkthru.WalkthruData' -as [Type])) { 61 | Add-Type -UsingNamespace System.Management.Automation -Namespace PSWalkthru -Name WalkthruData -MemberDefinition ' 62 | public string SourceFile = String.Empty;',' 63 | public string Command = String.Empty;',' 64 | public string Explanation = String.Empty;',' 65 | public string AudioFile = String.Empty;',' 66 | public string VideoFile = String.Empty;',' 67 | public string Question = String.Empty;',' 68 | public string Answer = String.Empty;',' 69 | public string Link = String.Empty;',' 70 | public string Screenshot = String.Empty;',' 71 | public string[] Hint;',' 72 | public ScriptBlock Script; 73 | public ScriptBlock Silent;',' 74 | public DateTime LastWriteTime; 75 | ' 76 | } 77 | #endregion Create walkthru type if it doesn't exist 78 | } 79 | process { 80 | if ($psCmdlet.ParameterSetName -eq "File") { 81 | # If the walkthru's in a file, open it and send it to Get-Walthru -Text 82 | $realItem = Get-Item $file -ErrorAction SilentlyContinue 83 | if (-not $realItem) { return } 84 | $text = [IO.File]::ReadAllText($realItem.FullName) 85 | $Result = Get-Walkthru -Text $text 86 | if ($result) { 87 | # If there was in fact walkthru information, add on the file name and the last write time. 88 | foreach ($r in $result) { 89 | $r.Sourcefile = $realItem.Fullname 90 | $r.LastWriteTime = $realItem.LastWriteTime 91 | $r 92 | } 93 | } 94 | return 95 | } elseif ($psCmdlet.ParameterSetName -eq "Command") { 96 | # If they want to see a command's examples a a walkthru, then pass each example to Get-Walkthru -Text 97 | $help = $command | Get-Help 98 | 99 | $c= 1 100 | $help.Examples.Example | 101 | ForEach-Object { 102 | $text = $_.code + ($_.remarks | Out-String) 103 | Get-Walkthru -Text $text | 104 | ForEach-Object { 105 | $_.Command = "$command Walkthru $c" 106 | $_ 107 | } 108 | $c++ 109 | } 110 | return 111 | } elseif ($psCmdlet.ParameterSetName -eq 'Module') { 112 | # For modules, enumerate all files for the current culture, then pass them down to Get-Walkthru -File 113 | $moduleRoot = Split-Path $module.Path 114 | Get-ChildItem -Path (Join-Path $moduleRoot "$(Get-Culture)") -Filter *.walkthru.help.txt | 115 | Get-Walkthru 116 | return 117 | } 118 | 119 | if ($psCmdlet.ParameterSetName -eq 'ScriptBlock') { 120 | $text = "$ScriptBlock" 121 | } 122 | 123 | # Tokenize the script 124 | $tokens = [Management.Automation.PSParser]::Tokenize($text, [ref]$err) 125 | if ($err.Count) { return } 126 | 127 | $lastToken = $null 128 | $isInContent = $false 129 | $lastResult = New-Object PSWalkthru.WalkthruData 130 | 131 | foreach ($token in $tokens) { 132 | if ($token.Type -eq "Newline") { continue } 133 | if ($token.Type -ne "Comment" -or $token.StartColumn -gt 1) { 134 | $isInContent = $true 135 | if (-not $lastToken) { $lastToken = $token } 136 | } else { 137 | if ($lastToken.Type -ne "Comment" -and $lastToken.StartColumn -eq 1) { 138 | $chunk = $text.Substring($lastToken.Start, 139 | $token.Start - 1 - $lastToken.Start) 140 | $lastResult.Script = [ScriptBlock]::Create($chunk) 141 | # mutliparagraph, split up the results if multiparagraph 142 | 143 | $paragraphs = @() 144 | $lastResult 145 | $null = $paragraphs 146 | $lastToken = $null 147 | $lastResult = New-Object PSWalkthru.WalkthruData 148 | $isInContent = $false 149 | } 150 | } 151 | 152 | if ($isInContent) { 153 | if ($token.Type -eq 'Comment' -and $token.StartColumn -eq 1) { 154 | $chunk = $text.Substring($lastToken.Start, 155 | $token.Start - 1 - $lastToken.Start) 156 | $lastResult.Script = [ScriptBlock]::Create($chunk) 157 | # mutliparagraph, split up the results if multiparagraph 158 | 159 | $paragraphs = @() 160 | $lastResult 161 | $null = $paragraphs 162 | $lastToken = $null 163 | $lastResult = New-Object PSWalkthru.WalkthruData 164 | $isInContent = $false 165 | } 166 | } 167 | if (-not $isInContent) { 168 | $lines = $token.Content.Trim("<>#") 169 | $lines = $lines.Split([Environment]::NewLine, 170 | [StringSplitOptions]"RemoveEmptyEntries") 171 | # Handle specialized return data 172 | foreach ($_ in $lines) { 173 | if ($_ -like ".Audio *" ) { 174 | $lastResult.AudioFile = ($_ -ireplace "\.Audio","").Trim() 175 | } elseif ($_ -like ".Video *" ) { 176 | $lastResult.VideoFile = ($_ -ireplace "\.Video","").Trim() 177 | } elseif ($_ -like ".Question *"){ 178 | $lastResult.Question = ($_ -ireplace "\.Question","").Trim() 179 | } elseif ($_ -like ".Answer *" ) { 180 | $lastResult.Answer = ($_ -ireplace "\.Answer","").Trim() 181 | } elseif ($_ -like ".Hint *") { 182 | $lastResult.Hint = $_.Substring(".Hint ".Length) -split ',' 183 | } elseif ($_ -like ".Link *") { 184 | $lastResult.Link = ($_ -ireplace "\.link","").Trim() 185 | } elseif ($_ -like ".Screenshot *") { 186 | $lastResult.Screenshot = ($_ -ireplace "\.Screenshot","").Trim() 187 | } elseif ($_ -like "*.Silent *") { 188 | $lastResult.Silent = [ScriptBlock]::Create(($_ -ireplace "\.Silent","").Trim()) 189 | } else { 190 | if ($_.TrimEnd().EndsWith(".")) { 191 | $lastResult.Explanation += ($_ + [Environment]::NewLine + [Environment]::NewLine + [Environment]::NewLine ) 192 | } else { 193 | $lastResult.Explanation += ($_ + [Environment]::NewLine) 194 | } 195 | 196 | } 197 | 198 | } 199 | } 200 | } 201 | 202 | 203 | if ($lastToken -and $lastResult) { 204 | $chunk = $text.Substring($lastToken.Start) 205 | $lastResult.Script = [ScriptBlock]::Create($chunk) 206 | $lastResult 207 | } elseif ($lastResult) { 208 | $lastResult 209 | } 210 | } 211 | } 212 | -------------------------------------------------------------------------------- /Get-WebConfigurationSetting.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Get-WebConfigurationSetting.ps1 -------------------------------------------------------------------------------- /Get-WebTemplateEditableRegion.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Get-WebTemplateEditableRegion.ps1 -------------------------------------------------------------------------------- /Import-DataTable.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Import-DataTable.ps1 -------------------------------------------------------------------------------- /Import-Deployment.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Import-Deployment.ps1 -------------------------------------------------------------------------------- /Import-PSData.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Import-PSData.ps1 -------------------------------------------------------------------------------- /Import-StoredProcedure.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Import-StoredProcedure.ps1 -------------------------------------------------------------------------------- /Install-PSNode.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Install-PSNode.ps1 -------------------------------------------------------------------------------- /Invoke-EC2.ps1: -------------------------------------------------------------------------------- 1 | function Invoke-EC2 { 2 | <# 3 | .Synopsis 4 | Invokes commands on EC2 instances 5 | .Description 6 | Invokes PowerShell commands on EC2 instances 7 | .Example 8 | Get-EC2 | 9 | Invoke-EC2 -ScriptBlock { Get-Process } 10 | .Link 11 | Get-EC2 12 | #> 13 | [CmdletBinding(DefaultParameterSetName='InProcess')] 14 | param( 15 | # The EC2 instance ID 16 | [Parameter(ParameterSetName='ComputerName',Mandatory=$true,ValueFromPipelineByPropertyName=$true,Position=0)] 17 | [string] 18 | $InstanceId, 19 | 20 | # An existing PS Session 21 | [Parameter(ParameterSetName='Session', Position=0, ValueFromPipelineByPropertyName=$true)] 22 | [ValidateNotNullOrEmpty()] 23 | [System.Management.Automation.Runspaces.PSSession[]] 24 | ${Session}, 25 | 26 | # The port used to invoke the command 27 | [Parameter(ParameterSetName='ComputerName')] 28 | [ValidateRange(1, 65535)] 29 | [System.Int32] 30 | ${Port}, 31 | 32 | # If set, will use SSL 33 | [Parameter(ParameterSetName='ComputerName')] 34 | [Switch] 35 | ${UseSSL}, 36 | 37 | # The configuration name 38 | [Parameter(ParameterSetName='ComputerName', ValueFromPipelineByPropertyName=$true)] 39 | [System.String] 40 | ${ConfigurationName}, 41 | 42 | # The application name 43 | [Parameter(ParameterSetName='ComputerName', ValueFromPipelineByPropertyName=$true)] 44 | [System.String] 45 | ${ApplicationName}, 46 | 47 | # The throttle limit 48 | [Parameter(ParameterSetName='ComputerName')] 49 | [System.Int32] 50 | ${ThrottleLimit}, 51 | 52 | # If set, will run the command as a job 53 | [Parameter(ParameterSetName='ComputerName')] 54 | [Parameter(ParameterSetName='Session')] 55 | [Switch] 56 | ${AsJob}, 57 | 58 | # If set, will hide the computername property from returned objects 59 | [Parameter(ParameterSetName='ComputerName')] 60 | [Parameter(ParameterSetName='Session')] 61 | [Alias('HCN')] 62 | [Switch] 63 | ${HideComputerName}, 64 | 65 | # The name of the job 66 | [Parameter(ParameterSetName='Session')] 67 | [Parameter(ParameterSetName='ComputerName')] 68 | [System.String] 69 | ${JobName}, 70 | 71 | # The command to run on the EC2 instance 72 | [Parameter(ParameterSetName='ComputerName', Mandatory=$true, Position=1)] 73 | [Parameter(ParameterSetName='Session', Mandatory=$true, Position=1)] 74 | [Alias('Command')] 75 | [ValidateNotNull()] 76 | [System.Management.Automation.ScriptBlock] 77 | ${ScriptBlock}, 78 | 79 | # Remoting session options 80 | [Parameter(ParameterSetName='ComputerName')] 81 | [System.Management.Automation.Remoting.PSSessionOption] 82 | ${SessionOption}, 83 | 84 | # Remoting authentication options 85 | [Parameter(ParameterSetName='ComputerName')] 86 | [System.Management.Automation.Runspaces.AuthenticationMechanism] 87 | ${Authentication}, 88 | 89 | # An input object 90 | [Parameter(ValueFromPipeline=$true)] 91 | [System.Management.Automation.PSObject] 92 | ${InputObject}, 93 | 94 | # Any arguments to the remote script 95 | [Alias('Args')] 96 | [System.Object[]] 97 | ${ArgumentList}, 98 | 99 | # The certificate thumbprint 100 | [Parameter(ParameterSetName='ComputerName')] 101 | [System.String] 102 | ${CertificateThumbprint} 103 | ) 104 | 105 | begin { 106 | 107 | } 108 | process { 109 | $ec2 = Get-EC2 -InstanceId $InstanceID 110 | 111 | if ($psCmdlet.ParameterSetNAme -eq 'ComputerName') { 112 | $ec2Cred = $ec2 | Get-EC2InstancePassword -AsCredential 113 | $ec2 | Enable-EC2Remoting -PowerShell -ErrorAction SilentlyContinue 114 | $icmParams = @{} + $psBoundParameters 115 | $icmParams.Remove('InstanceId') 116 | 117 | Invoke-Command -ComputerName $ec2.PublicDnsName -Credential $ec2Cred @icmParams 118 | } else { 119 | Invoke-Command @psboundParameters 120 | } 121 | 122 | 123 | } 124 | end { 125 | 126 | } 127 | } 128 | -------------------------------------------------------------------------------- /Invoke-Office365.ps1: -------------------------------------------------------------------------------- 1 | function Invoke-Office365 2 | { 3 | <# 4 | .Synopsis 5 | Invokes commands within Office365 6 | .Description 7 | Invokes PowerShell commands within Office365 8 | .Example 9 | Invoke-Office365 -ScriptBlock { Get-Mailbox -Identity james.brundage@start-automating.com } 10 | .LINK 11 | http://help.outlook.com/en-us/140/cc952755.aspx 12 | #> 13 | [CmdletBinding(DefaultParameterSetName='Office365')] 14 | [OutputType([PSObject])] 15 | param( 16 | # The credential for the Office365 account 17 | [Parameter(Position=1,ParameterSetName='ExchangeServer', ValueFromPipelineByPropertyName=$true)] 18 | [Parameter(Position=1,ParameterSetName='Office365', ValueFromPipelineByPropertyName=$true)] 19 | [Management.Automation.PSCredential] 20 | $Account, 21 | 22 | # A list of account settings to use. 23 | [Parameter(ValueFromPipelineByPropertyName=$true)] 24 | [string[]] 25 | $AccountSetting = @("Office365UserName", "Office365Password"), 26 | 27 | # The exchange server name. Only required if you're not invoking against Office365 28 | [Parameter(Mandatory=$true,Position=2,ParameterSetName='ExchangeServer', ValueFromPipelineByPropertyName=$true)] 29 | [string] 30 | $ServerName, 31 | 32 | # The script block to run in Office365 33 | [Parameter(Position=0)] 34 | [string[]] 35 | $ScriptBlock, 36 | 37 | # Any arguments to the script 38 | [Parameter(ValueFromPipeline=$true, ValueFromRemainingArguments=$true)] 39 | [PSObject[]] 40 | $ArgumentList, 41 | 42 | # The name of the session. If omitted, the name will contain the email used to connect to Office365. 43 | [Parameter(ValueFromPipelineByPropertyName=$true)] 44 | [string]$Name, 45 | 46 | 47 | # If set, will run the command in a background job 48 | [Parameter(ValueFromPipelineByPropertyName=$true)] 49 | [Switch] 50 | $AsJob, 51 | 52 | # If set, will create a fresh connection and destroy the connection when the command is complete. 53 | # This is slower, but less likely to make the exchange server experience a session bottleneck. 54 | [Parameter(ValueFromPipelineByPropertyName=$true)] 55 | [Switch] 56 | $FreshConnection 57 | ) 58 | 59 | begin { 60 | if (-not $script:JobCounter) { 61 | $script:JobCounter = 1 62 | } 63 | } 64 | 65 | process { 66 | #region Copy Credential for Office365 67 | if (-not $Account) { 68 | if ($AccountSetting -and $accountSetting.Count -eq 2) { 69 | $username = Get-SecureSetting $accountSetting[0] -ValueOnly 70 | $password = Get-SecureSetting $accountSetting[1] -ValueOnly 71 | if ($username -and $password) { 72 | $account = New-Object Management.Automation.PSCredential $username,(ConvertTo-SecureString -AsPlainText -Force $password ) 73 | $psBoundParameters.Account = $account 74 | } 75 | } 76 | } 77 | 78 | if (-not $account) { 79 | Write-Error "Must provide an Account or AccountSetting to connect to Office365" 80 | return 81 | } 82 | #endregion Copy Credential for Office365 83 | 84 | 85 | 86 | #region Launch Background Job if Needed 87 | if ($AsJob) { 88 | $myDefinition = [ScriptBLock]::Create("function Invoke-Office365 { 89 | $(Get-Command Invoke-Office365 | Select-Object -ExpandProperty Definition) 90 | } 91 | ") 92 | $null = $psBoundParameters.Remove('AsJob') 93 | 94 | $myJob= [ScriptBLock]::Create("" + { 95 | param([Hashtable]$parameter) 96 | 97 | } + $myDefinition + { 98 | 99 | Invoke-Office365 @parameter 100 | }) 101 | if (-not $name) { 102 | $name = "Office365Job${script:JobCounter}" 103 | $script:JobCounter++ 104 | } 105 | Start-Job -Name "$name " -ScriptBlock $myJob -ArgumentList $psBoundParameters 106 | return 107 | } 108 | #endregion Launch Background Job if Needed 109 | 110 | 111 | 112 | #region Prepare Session Parameters 113 | if ($psCmdlet.ParameterSetName -eq 'Office365') { 114 | if ($script:ExchangeWebService -and $script:CachedCredential.Username -eq $script:CachedCredential) { 115 | return 116 | } 117 | $ExchangeServer = "https://ps.outlook.com/" 118 | Write-Progress "Connecting to Office365" "$exchangeServer" 119 | $script:CachedCredential = $Account 120 | 121 | $newSessionParameters = @{ 122 | ConnectionUri='https://ps.outlook.com/powershell' 123 | ConfigurationName='Microsoft.Exchange' 124 | Authentication='Basic' 125 | Credential=$Account 126 | AllowRedirection=$true 127 | WarningAction = "silentlycontinue" 128 | SessionOption=(New-Object Management.Automation.Remoting.PSSessionOption -Property @{OpenTimeout="00:30:00"}) 129 | Name = "https://$($Account.UserName)@ps.outlook.com/powershell" 130 | 131 | } 132 | 133 | $ExchangeServer = "https://ps.outlook.com/" 134 | } else { 135 | $ExchangeServer = $ServerName 136 | $newSessionParameters = @{ 137 | ConnectionUri="https://$ServerName/powershell" 138 | ConfigurationName='Microsoft.Exchange' 139 | Authentication='Basic' 140 | Credential=$Account 141 | AllowRedirection=$true 142 | WarningAction = "silentlycontinue" 143 | Name = "https://$ServerName/powershell" 144 | SessionOption=(New-Object Management.Automation.Remoting.PSSessionOption -Property @{OpenTimeout="00:30:00"}) 145 | 146 | } 147 | } 148 | 149 | if ($psBoundParameters.Name) { 150 | $newSessionParameters.Name = $psBoundParameters.Name 151 | } 152 | #endregion Prepare Session Parameters 153 | 154 | 155 | #region Find or Create Session 156 | $existingSession = (Get-PSSession -Name $newSessionParameters.Name -ErrorAction SilentlyContinue) 157 | if ($FreshConnection -or (-not $existingSession ) -or ($existingSession.State -ne 'Opened')) { 158 | if ($existingSession) { 159 | $existingSession | Remove-PSSession 160 | } 161 | if (-not $FreshConnection) { 162 | $Session = New-PSSession @newSessionParameters -WarningVariable warning 163 | } 164 | } else { 165 | $Session = $existingSession 166 | } 167 | #endregion Find or Create Session 168 | 169 | 170 | #region Invoke on Office365 171 | if (-not $Session -and -not $FreshConnection) { return } 172 | 173 | foreach ($s in $scriptBlock) { 174 | $realScriptBlock =[ScriptBlock]::Create($s) 175 | if (-not $realScriptBlock) { continue } 176 | 177 | if (-not $FreshConnection) { 178 | Invoke-Command -Session $session -ArgumentList $Arguments -ScriptBlock $realScriptBlock 179 | } else { 180 | $null = $newSessionParameters.Remove("Name") 181 | Start-Job -ArgumentList $Account, $realScriptBlock,$Arguments -ScriptBlock { 182 | param([Management.Automation.PSCredential]$account, $realScriptBlock, $Arguments) 183 | 184 | $realScriptBlock = [ScriptBlock]::Create($realScriptBlock) 185 | $newSessionParameters = @{ 186 | ConnectionUri='https://ps.outlook.com/powershell' 187 | ConfigurationName='Microsoft.Exchange' 188 | Authentication='Basic' 189 | Credential=$Account 190 | AllowRedirection=$true 191 | WarningAction = "silentlycontinue" 192 | SessionOption=(New-Object Management.Automation.Remoting.PSSessionOption -Property @{OpenTimeout="00:30:00"}) 193 | 194 | 195 | } 196 | 197 | Invoke-Command @newsessionParameters -ArgumentList $Arguments -ScriptBlock $realScriptBlock 198 | } | Wait-Job | Receive-Job 199 | 200 | } 201 | 202 | } 203 | 204 | if ($session -and $FreshConnection) { 205 | Remove-PSSession -Session $session 206 | } 207 | #endregion Invoke on Office365 208 | } 209 | } 210 | 211 | 212 | -------------------------------------------------------------------------------- /Invoke-Parallel.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Invoke-Parallel.ps1 -------------------------------------------------------------------------------- /Invoke-WebCommand.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Invoke-WebCommand.ps1 -------------------------------------------------------------------------------- /Join-Website.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Join-Website.ps1 -------------------------------------------------------------------------------- /License.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/License.md -------------------------------------------------------------------------------- /New-AzureServiceDefinition.ps1: -------------------------------------------------------------------------------- 1 | function New-AzureServiceDefinition 2 | { 3 | <# 4 | .Synopsis 5 | Creates a new Azure Service Definition XML 6 | .Description 7 | Creates a new Azure Service Definition XML. 8 | Additional commands are used to modify the XML's settings 9 | .Example 10 | New-AzureServiceDefinition -ServiceName TestService | 11 | Add-AzureWebSite -HostHeader www.testsite.com -PhysicalDirectory 'C:\inetpub\wwwroot\testsite' 12 | .Link 13 | Add-AzureRole 14 | .Link 15 | Add-AzureStartupTask 16 | .Link 17 | Add-AzureWebSite 18 | .Link 19 | Add-AzureLocalResource 20 | #> 21 | [OutputType([xml],[string])] 22 | param( 23 | # Required. The name of the service. The name must be unique within the service account. 24 | [Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)] 25 | [Alias('Name')] 26 | [String] 27 | $ServiceName, 28 | 29 | <# 30 | Optional. Specifies the number of upgrade domains across which roles in this service are allocated. 31 | Role instances are allocated to an upgrade domain when the service is deployed. For more information, 32 | see "How to Perform In-Place Upgrades" on MSDN. 33 | 34 | You can specify up to 5 upgrade domains. If not specified, the default number of upgrade domains is 5. 35 | #> 36 | [int] 37 | $UpgradeDomainCount, 38 | 39 | # If set, will output the XML as text. If this is not set, an XmlElement is returned. 40 | [switch] 41 | $AsString 42 | ) 43 | 44 | process { 45 | #region Declare the root XML 46 | if ($psBoundParameters.ContainsKey('UpgradeDomainCount')) { 47 | $def = @" 48 | <ServiceDefinition name="$ServiceName" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" upgradeDomainCount="$UpgradeDomainCount" /> 49 | "@ 50 | } else { 51 | $def = @" 52 | <ServiceDefinition name="$ServiceName" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" /> 53 | "@ 54 | } 55 | #endregion Declare the root XML 56 | 57 | #region Output the configuration 58 | $xml = [xml]$def 59 | if ($AsString) { 60 | $strWrite = New-Object IO.StringWriter 61 | $xml.Save($strWrite) 62 | return "$strWrite" 63 | } else { 64 | $Xml 65 | } 66 | #endregion Output the configuration 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /New-Datatable.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/New-Datatable.ps1 -------------------------------------------------------------------------------- /New-RDPFile.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/New-RDPFile.ps1 -------------------------------------------------------------------------------- /New-RssItem.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/New-RssItem.ps1 -------------------------------------------------------------------------------- /New-SQLDatabase.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/New-SQLDatabase.ps1 -------------------------------------------------------------------------------- /New-Webpage.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/New-Webpage.ps1 -------------------------------------------------------------------------------- /Open-EC2Port.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Open-EC2Port.ps1 -------------------------------------------------------------------------------- /Open-Port.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Open-Port.ps1 -------------------------------------------------------------------------------- /Out-Daemon.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Out-Daemon.ps1 -------------------------------------------------------------------------------- /Out-RssFeed.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Out-RssFeed.ps1 -------------------------------------------------------------------------------- /Out-Zip.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Out-Zip.ps1 -------------------------------------------------------------------------------- /Pages/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Pages/favicon.ico -------------------------------------------------------------------------------- /Pipeworks.EzFormat.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Pipeworks.EzFormat.ps1 -------------------------------------------------------------------------------- /Pipeworks.Pipeworks.psd1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Pipeworks.Pipeworks.psd1 -------------------------------------------------------------------------------- /Pipeworks.Scriptcop.psd1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Pipeworks.Scriptcop.psd1 -------------------------------------------------------------------------------- /Pipeworks.VersionHistory.psd1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Pipeworks.VersionHistory.psd1 -------------------------------------------------------------------------------- /Pipeworks.psd1: -------------------------------------------------------------------------------- 1 | @{ 2 | ModuleVersion = '1.9.9.41' 3 | ModuleToProcess = 'Pipeworks.psm1' 4 | FormatsToProcess = 'Pipeworks.Format.ps1xml' 5 | Copyright = 'Copyright 2012-2014 Start-Automating' 6 | Guid = 'fe3a0426-9f76-488d-b1ee-c5c409d795ad' 7 | Author = 'Start-Automating' 8 | Description = 'Putting it all together with PowerShell' 9 | VariablesToExport = '*' 10 | CmdletsToExport = '*' 11 | CompanyName='Start-Automating' 12 | } 13 | -------------------------------------------------------------------------------- /Pipeworks.psm1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Pipeworks.psm1 -------------------------------------------------------------------------------- /Publish-AzureService.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Publish-AzureService.ps1 -------------------------------------------------------------------------------- /Publish-Deployment.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Publish-Deployment.ps1 -------------------------------------------------------------------------------- /Push-Deployment.ps1: -------------------------------------------------------------------------------- 1 | function Push-Deployment 2 | { 3 | <# 4 | .Synopsis 5 | Pushes a deployment to Azure 6 | .Description 7 | Pushes an existing deployment to an Azure service 8 | .Example 9 | Push-Deployment "StartAutomating" ".\startautomating.cspkg" ".\startautomating.cscfg" -FirstLabel Start-Scripting -Second Update-Web 10 | .Link 11 | Get-Deployment 12 | .Link 13 | Import-Deployment 14 | .Link 15 | Remove-Deployment 16 | #> 17 | [CmdletBinding(DefaultParameterSetName='PushAzureDeployment')] 18 | [OutputType([Nullable])] 19 | param( 20 | # The name of the service 21 | [Parameter(Mandatory=$true,ParameterSetName='PushAzureDeployment',ValueFromPipelineByPropertyName=$true)] 22 | [string] 23 | $ServiceName, 24 | 25 | # The path to the CSPackage (.cspkg) file 26 | [Parameter(Mandatory=$true,ParameterSetName='PushAzureDeployment',ValueFromPipelineByPropertyName=$true)] 27 | [string] 28 | $PackagePath, 29 | 30 | # The path to the CSConfigurationFile (.cscfg) file 31 | [Parameter(Mandatory=$true,ParameterSetName='PushAzureDeployment',ValueFromPipelineByPropertyName=$true)] 32 | [string] 33 | $ConfigurationPath, 34 | 35 | # The label of the first deployment slot 36 | [Parameter(ParameterSetName='PushAzureDeployment',ValueFromPipelineByPropertyName=$true)] 37 | [string] 38 | $FirstLabel = "Primary", 39 | 40 | # The label of the second deployment slot 41 | [Parameter(ParameterSetName='PushAzureDeployment',ValueFromPipelineByPropertyName=$true)] 42 | [string] 43 | $SecondLabel = "Secondary", 44 | 45 | # The name of the storage account that will contain the bits 46 | [Parameter(Mandatory=$true,ParameterSetName='PushToAzureVMs')] 47 | [string] 48 | $StorageAccount, 49 | 50 | # The storage key of the storage account that will contain the bits 51 | [Parameter(Mandatory=$true,ParameterSetName='PushToAzureVMs')] 52 | [string] 53 | $StorageKey, 54 | 55 | # If set, will push the deployment to Azure VMs 56 | [Parameter(Mandatory=$true,ParameterSetName='PushToAzureVMs')] 57 | [Switch] 58 | $ToAzureVM, 59 | 60 | # The name of the computers that will receive the deployment 61 | [Parameter(ParameterSetName='PushToAzureVMs')] 62 | [string[]] 63 | $ComputerName, 64 | 65 | 66 | # The name of the computers that will receive the deployment 67 | [Parameter(Mandatory=$true,ParameterSetName='PushToAzureVMs')] 68 | [Management.Automation.PSCredential] 69 | $Credential 70 | 71 | 72 | ) 73 | 74 | process { 75 | if ($PSCmdlet.ParameterSetName -eq 'PushAzureDeployment') { 76 | #region Push a deployment package to Azure 77 | $azureModuleInstalled = Import-Module Azure -Global -PassThru 78 | if (-not $azureModuleInstalled) { 79 | Write-Error "Must install Azure module" 80 | return 81 | } 82 | $currentDeployment = Get-AzureDeployment -ServiceName $ServiceName 83 | 84 | $newlabel = if ($currentDeployment.label -ne $FirstLabel) { 85 | $FirstLabel 86 | } else { 87 | $SecondLabel 88 | } 89 | 90 | $resolvedPackagePath = $ExecutionContext.SessionState.Path.GetResolvedPSPathFromPSPath($PackagePath) 91 | if (-not $resolvedPackagePath) { return } 92 | $resolvedConfigPath = $ExecutionContext.SessionState.Path.GetResolvedPSPathFromPSPath($ConfigurationPath) 93 | if (-not $resolvedConfigPath) { return } 94 | 95 | Remove-AzureDeployment -ServiceName $ServiceName -Slot Staging -Force -ErrorAction SilentlyContinue 96 | 97 | $deploymentParameters = @{ 98 | Package= "$resolvedPackagePath" 99 | Configuration = "$resolvedConfigPath" 100 | Label = $newLabel 101 | } 102 | 103 | 104 | New-AzureDeployment @deploymentParameters -ServiceName $ServiceName -Slot Staging 105 | #endregion Push a deployment package to Azure 106 | } elseif ($pscmdlet.ParameterSetName -eq 'PushToAzureVMs') { 107 | #region Push a deployment stored in blob storage into Azure VMs 108 | 109 | $params = @{} + $PSBoundParameters 110 | $sb = { 111 | Add-Type -AssemblyName System.Web 112 | 113 | }.ToString() + @" 114 | function Expand-Zip { 115 | $((Get-Command Expand-Zip).Definition) 116 | } 117 | 118 | function Get-Web { 119 | $((Get-Command Get-Web).Definition) 120 | } 121 | 122 | function Import-Blob { 123 | $((Get-Command Import-Blob).Definition) 124 | } 125 | 126 | function Get-Blob { 127 | $((Get-Command Get-Blob).Definition) 128 | } 129 | "@ 130 | 131 | 132 | $sb = [ScriptBlock]::Create($sb) 133 | 134 | 135 | $syncScript = " 136 | `$null = New-module -Name Pipeworks -ScriptBlock {$sb} 137 | `$storageAccount = '$storageAccount' 138 | `$storageKey = '$storageKey' 139 | " 140 | $syncScript += { 141 | # Move modules to old modules 142 | 143 | 144 | Get-Blob -StorageAccount $StorageAccount -StorageKey $StorageKey | 145 | Where-Object {$_.Container -like "*-source" } | 146 | ForEach-Object { 147 | 148 | $innerData = $_ | 149 | Get-Blob | 150 | Sort-Object { $_.LastModified } -Descending | 151 | Select-Object -First 1 | 152 | Get-Blob 153 | 154 | 155 | 156 | $tempDir = [IO.Path]::GetTempPath() 157 | $theFile = Join-Path $tempDir ($innerData.Container + $innerData.Name) 158 | $theTempDir = Join-Path $tempDir $innerData.Container 159 | 160 | [IO.FILE]::WriteAllBytes("$theFile", $innerData.BlobData) 161 | 162 | 163 | 164 | 165 | Expand-Zip -ZipPath "$theFile" -OutputPath $theTempDir 166 | 167 | $moduleDir = 168 | dir $theTempDir -Recurse -Filter "$($innerData.Container.Replace("-source", '')).psm1" | 169 | Split-Path | 170 | Get-Item 171 | 172 | 173 | 174 | if (-not $moduleDir) { return } 175 | $destModuleDir = "$env:UserProfile\Documents\WindowsPowerShell\Modules\$($moduleDir.Name.Replace('-source', ''))" 176 | 177 | 178 | if (Test-Path $destModuleDir) { 179 | $destModuleDir | Remove-Item -Recurse -Force 180 | } 181 | 182 | $null = New-Item -ItemType Directory -path $destModuleDir -ErrorAction SilentlyContinue 183 | 184 | 185 | 186 | $moduleName = $moduleDir | Split-Path -Leaf 187 | 188 | $dir = Get-Item $destModuleDir 189 | $filesExist = dir $moduleDir -Recurse -Force | 190 | Where-Object { -not $_.psIsContainer } 191 | 192 | if ($filesExist) { 193 | Move-Item "$env:UserProfile\Documents\WindowsPowerShell\Modules\$moduleName" "$env:UserProfile\Documents\WindowsPowerShell\Modules.Old.$((Get-Date).ToShortDateString().Replace('/','-'))" -ErrorAction SilentlyContinue -Force 194 | 195 | $filesExist | 196 | ForEach-Object { 197 | $_ | 198 | Copy-Item -Destination { 199 | $newPath = $_.FullName.Replace("$($moduleDir.Fullname)", "$($dir.FullName)") 200 | 201 | $newDir = $newPAth |Split-Path 202 | if (-not (Test-Path $newDir)) { 203 | $null = New-Item -ItemType Directory -Path "$newDir" -Force 204 | } 205 | 206 | 207 | Write-Progress "Copying $($req.name)" "$newPath" 208 | $newPath 209 | 210 | } -Force 211 | } 212 | } 213 | 214 | 215 | 216 | Remove-Item -LiteralPath $theTempDir -Force -Recurse 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | } 228 | 229 | 230 | 231 | #Move-Item "$home\Documents\WindowsPowerShell\SyncedModules" "$home\Documents\WindowsPowerShell\SyncedModules" 232 | 233 | } 234 | 235 | 236 | $syncScript = [ScriptBlock]::Create($syncScript) 237 | Get-AzureVM | 238 | Where-Object { 239 | $comp = $_ 240 | if ($params.ComputerName) { 241 | foreach ($cn in $ComputerName) { 242 | if ($comp.Name -like $cn) { 243 | return $true 244 | } 245 | } 246 | } else { 247 | return $true 248 | } 249 | } | 250 | ForEach-Object { 251 | Invoke-Command -ComputerName "$($_.Name).cloudapp.net" -Credential $Credential -Authentication Credssp -ScriptBlock $syncScript -AsJob -JobName $_.Name 252 | } 253 | #endregion Push a deployment stored in blob storage into Azure VMs 254 | } elseif ($PSCmdlet.ParameterSetName -eq 'PushToLan') { 255 | 256 | 257 | 258 | 259 | } 260 | 261 | 262 | } 263 | } 264 | 265 | -------------------------------------------------------------------------------- /Push-FTP.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Push-FTP.ps1 -------------------------------------------------------------------------------- /ReadMe.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | [Official Website](http://PowerShellPipeworks.com) 4 | 5 | 6 | 7 | 8 | PowerShell Pipeworks is a framework for writing Sites and Software Services in Windows PowerShell modules. 9 | 10 | 11 | Pipeworks provides powerful tools to write websites in PowerShell. 12 | 13 | 14 | It helps you pipe together tons of tech to write smarter software as a service. 15 | 16 | 17 | 18 | The easiest way to explore pipeworks to to visit the web site [http://powershellpipeworks.com/](http://powershellpipeworks.com), or to build yourself a local copy. 19 | 20 | 21 | To do this, make sure you: 22 | 23 | 1. Download and Install PowerShell Pipeworks 24 | 2. Enable IIS and ASP.NET 25 | 3. Install the [IIS URL Rewrite](http://www.iis.net/downloads/microsoft/url-rewrite) extension 26 | 4. Change your local PowerShell execution policy to Bypass (Set-ExecutionPolicy Bypass -Force) 27 | 28 | 29 | Once you've done this, just open up PowerShell and run these three lines to create your local Pipeworks site and run it. 30 | 31 | 32 | Import-Module Pipeworks 33 | ConvertTo-ModuleService Pipeworks -AllowDownload -Force 34 | Start-Process http://localhost/pipeworks 35 | 36 | 37 | 38 | #### Getting Started 39 | 40 | 41 | * [About PowerShell Pipeworks](http://PowerShellPipeworks.com/About PowerShell Pipeworks/) 42 | * [Pipeworks Quickstart](http://PowerShellPipeworks.com/Pipeworks Quickstart/) 43 | * [The Pipeworks Manifest](http://PowerShellPipeworks.com/The Pipeworks Manifest/) 44 | * [From Script To Software Service](http://PowerShellPipeworks.com/From Script To Software Service/) 45 | * [What Pipeworks Does](http://PowerShellPipeworks.com/What Pipeworks Does/) 46 | * [Scripting Securely with SecureSettings](http://PowerShellPipeworks.com/Scripting Securely with SecureSettings/) 47 | * [NOHtml Sites](http://PowerShellPipeworks.com/NOHtml Sites/) 48 | 49 | #### Play with Pipeworks 50 | 51 | 52 | * [Write-ASPDotNetScriptPage](http://PowerShellPipeworks.com/Write-ASPDotNetScriptPage/) 53 | * [ConvertFrom-Markdown](http://PowerShellPipeworks.com/ConvertFrom-Markdown/) 54 | * [Making Editing Easier With Markdown](http://PowerShellPipeworks.com/Making%20Editing%20Easier%20With%20Markdown/) 55 | * [Write-ScriptHTML](http://PowerShellPipeworks.com/Write-ScriptHTML/) 56 | * [Making Tables with Out-HTML](http://PowerShellPipeworks.com/Making%20Tables%20with%20Out-HTML/) 57 | * [Working with Write-Link](http://PowerShellPipeworks.com/Working%20with%20Write-Link/) 58 | 59 | #### Connecting the Clouds 60 | 61 | 62 | * [Get-Paid with Stripe](http://PowerShellPipeworks.com/Get-Paid%20with%20Stripe/) 63 | * [Getting GitIt](http://PowerShellPipeworks.com/Getting%20GitIt/) 64 | * [Get-Web Content From Anywhere](http://PowerShellPipeworks.com/Get-Web%20Content%20From%20Anywhere/) 65 | * [Pick up the Phone with Pipeworks](http://PowerShellPipeworks.com/Pick%20up%20the%20Phone%20with%20Pipeworks/) 66 | * [Implicit Texting with Twilio](http://PowerShellPipeworks.com/Implicit%20Texting%20with%20Twilio/) 67 | * [The Wonders of Wolfram Alpha](http://PowerShellPipeworks.com/The%20Wonders%20of%20Wolfram%20Alpha/) 68 | * [Using Azure Table Storage in Pipeworks](http://PowerShellPipeworks.com/Using%20Azure%20Table%20Storage%20in%20Pipeworks/) 69 | * [Simplified SQL](http://PowerShellPipeworks.com/Simplified%20SQL/) 70 | * [Building with Blob Storage](http://PowerShellPipeworks.com/Building%20with%20Blob%20Storage/) 71 | * [Publishing Pipeworks to Azure](http://PowerShellPipeworks.com/Publishing%20Pipeworks%20to%20Azure/) 72 | * [Looking Up Locations With Resolve-Location](http://PowerShellPipeworks.com/Looking%20Up%20Locations%20With%20Resolve-Location/) 73 | 74 | #### Join Windows and Web 75 | 76 | 77 | * [Why Windows](http://PowerShellPipeworks.com/Why%20Windows/) 78 | * [Scripting with Superglue](http://PowerShellPipeworks.com/Scripting%20with%20Superglue/) 79 | * [Integrated Intranet](http://PowerShellPipeworks.com/Integrated%20Intranet/) 80 | * [Simpler SEO](http://PowerShellPipeworks.com/Simpler%20SEO/) 81 | 82 | -------------------------------------------------------------------------------- /Remove-Daemon.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Remove-Daemon.ps1 -------------------------------------------------------------------------------- /Remove-Deployment.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Remove-Deployment.ps1 -------------------------------------------------------------------------------- /Remove-EC2.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Remove-EC2.ps1 -------------------------------------------------------------------------------- /Remove-EC2KeyPair.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Remove-EC2KeyPair.ps1 -------------------------------------------------------------------------------- /Remove-EC2SecurityGroup.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Remove-EC2SecurityGroup.ps1 -------------------------------------------------------------------------------- /Remove-SecureSetting.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Remove-SecureSetting.ps1 -------------------------------------------------------------------------------- /Reset-EC2.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Reset-EC2.ps1 -------------------------------------------------------------------------------- /Resolve-Location.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Resolve-Location.ps1 -------------------------------------------------------------------------------- /Schematics/Blog/Use-BlogSchematic.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Schematics/Blog/Use-BlogSchematic.ps1 -------------------------------------------------------------------------------- /Schematics/Bookshelf/Use-BookshelfSchematic.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Schematics/Bookshelf/Use-BookshelfSchematic.ps1 -------------------------------------------------------------------------------- /Schematics/Bot/Use-BotSchematic.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Schematics/Bot/Use-BotSchematic.ps1 -------------------------------------------------------------------------------- /Schematics/CheckpointData/Use-CheckpointDataSchematic.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Schematics/CheckpointData/Use-CheckpointDataSchematic.ps1 -------------------------------------------------------------------------------- /Schematics/Crudbin/Use-CrudBinSchematic.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Schematics/Crudbin/Use-CrudBinSchematic.ps1 -------------------------------------------------------------------------------- /Schematics/Dashboard/Use-DashboardSchematic.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Schematics/Dashboard/Use-DashboardSchematic.ps1 -------------------------------------------------------------------------------- /Schematics/Gallery/Use-GallerySchematic.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Schematics/Gallery/Use-GallerySchematic.ps1 -------------------------------------------------------------------------------- /Schematics/Interested/Use-InterestedSchematic.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Schematics/Interested/Use-InterestedSchematic.ps1 -------------------------------------------------------------------------------- /Schematics/ObjectPage/Use-ObjectPageSchematic.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Schematics/ObjectPage/Use-ObjectPageSchematic.ps1 -------------------------------------------------------------------------------- /Schematics/ParkingMeter/Use-ParkingMeterSchematic.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Schematics/ParkingMeter/Use-ParkingMeterSchematic.ps1 -------------------------------------------------------------------------------- /Schematics/ParkingMeter/Watch-Meter.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Schematics/ParkingMeter/Watch-Meter.ps1 -------------------------------------------------------------------------------- /Schematics/PartWiki/Use-PartWikiSchematic.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Schematics/PartWiki/Use-PartWikiSchematic.ps1 -------------------------------------------------------------------------------- /Schematics/SimpleSearch/Use-SimpleSearchSchematic.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Schematics/SimpleSearch/Use-SimpleSearchSchematic.ps1 -------------------------------------------------------------------------------- /Schematics/StagePage/Use-StagePageSchematic.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Schematics/StagePage/Use-StagePageSchematic.ps1 -------------------------------------------------------------------------------- /Schematics/Win8/Use-Win8Schematic.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Schematics/Win8/Use-Win8Schematic.ps1 -------------------------------------------------------------------------------- /Search-Engine.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Search-Engine.ps1 -------------------------------------------------------------------------------- /Search-WolframAlpha.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Search-WolframAlpha.ps1 -------------------------------------------------------------------------------- /Select-DataTable.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Select-DataTable.ps1 -------------------------------------------------------------------------------- /Select-Sql.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Select-Sql.ps1 -------------------------------------------------------------------------------- /Select-Wmi.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Select-Wmi.ps1 -------------------------------------------------------------------------------- /Send-Email.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Send-Email.ps1 -------------------------------------------------------------------------------- /Send-PhoneCall.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Send-PhoneCall.ps1 -------------------------------------------------------------------------------- /Send-TextMessage.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Send-TextMessage.ps1 -------------------------------------------------------------------------------- /Set-AWSConnectionInfo.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Set-AWSConnectionInfo.ps1 -------------------------------------------------------------------------------- /Show-WebObject.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Show-WebObject.ps1 -------------------------------------------------------------------------------- /Start-MapReduce.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Start-MapReduce.ps1 -------------------------------------------------------------------------------- /Start-PSNode.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Start-PSNode.ps1 -------------------------------------------------------------------------------- /Switch-TestDeployment.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Switch-TestDeployment.ps1 -------------------------------------------------------------------------------- /Templates/Command-InvertedHeader.pswt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Templates/Command-InvertedHeader.pswt -------------------------------------------------------------------------------- /Templates/Command.pswt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Templates/Command.pswt -------------------------------------------------------------------------------- /Templates/Module-InvertedHeader.pswt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Templates/Module-InvertedHeader.pswt -------------------------------------------------------------------------------- /Templates/Module.pswt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Templates/Module.pswt -------------------------------------------------------------------------------- /Templates/Topic-InvertedHeader.pswt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Templates/Topic-InvertedHeader.pswt -------------------------------------------------------------------------------- /Templates/Topic.pswt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Templates/Topic.pswt -------------------------------------------------------------------------------- /Test-W3C.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Test-W3C.ps1 -------------------------------------------------------------------------------- /Tests/SQL/Create_And_Update_MySQL.test.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Tests/SQL/Create_And_Update_MySQL.test.ps1 -------------------------------------------------------------------------------- /Tests/SQL/Create_And_Update_SqlCompact.test.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Tests/SQL/Create_And_Update_SqlCompact.test.ps1 -------------------------------------------------------------------------------- /Tests/SQL/Create_And_Update_SqlServer.test.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Tests/SQL/Create_And_Update_SqlServer.test.ps1 -------------------------------------------------------------------------------- /Tests/SQL/Create_And_Update_Sqlite.test.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Tests/SQL/Create_And_Update_Sqlite.test.ps1 -------------------------------------------------------------------------------- /Update-DataTable.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Update-DataTable.ps1 -------------------------------------------------------------------------------- /Update-SQL.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Update-SQL.ps1 -------------------------------------------------------------------------------- /Use-Less.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Use-Less.ps1 -------------------------------------------------------------------------------- /Use-Schematic.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Use-Schematic.ps1 -------------------------------------------------------------------------------- /Wait-Deployment.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Wait-Deployment.ps1 -------------------------------------------------------------------------------- /Wait-EC2.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Wait-EC2.ps1 -------------------------------------------------------------------------------- /Watch-Daemon.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Watch-Daemon.ps1 -------------------------------------------------------------------------------- /Write-Ajax.ps1: -------------------------------------------------------------------------------- 1 | function Write-Ajax 2 | { 3 | <# 4 | .Synopsis 5 | Writes AJAX 6 | .Description 7 | Writes AJAX. This will execute the URL and replace the contents of 8 | the HTML element with the ID $updateId with the contents of the returned document 9 | .Link 10 | New-WebPage 11 | 12 | #> 13 | [OutputType([string])] 14 | param( 15 | # The URL that will return updated contents 16 | [Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)] 17 | [Uri]$Url, 18 | 19 | # The method to use for the request 20 | [ValidateSet("GET", "POST")] 21 | [string]$Method = "GET", 22 | 23 | # The ID to automatically update 24 | [Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)] 25 | [string]$UpdateId, 26 | 27 | # One or more input query values. 28 | [Parameter(ValueFromPipelineByPropertyName=$true)] 29 | [string[]]$InputQuery, 30 | 31 | # The InputIDs the provide the query values. 32 | [Parameter(ValueFromPipelineByPropertyName=$true)] 33 | [string[]]$InputId, 34 | 35 | # The name of the generated function. If this is not provided, it will be set automatically from the URL 36 | [string]$Name, 37 | 38 | # Any post data 39 | [string]$PostData, 40 | 41 | # The Property to update on the update element 42 | [string]$UpdateProperty = "innerHTML", 43 | 44 | # If set, will output the ajax chunk in a <script> tag </script> 45 | [switch]$IncludeScriptTag, 46 | 47 | # If set, will escape the output content. 48 | # If generating web pages with Write-Ajax to display to the user, instead of run in the browser, use -Escape 49 | [Switch]$Escape, 50 | 51 | # Runs one or more javascript functions when an ajax call completes, but before the property is set 52 | [string[]] 53 | $WhenResultReceived, 54 | 55 | # Runs one or more javascript functions when an ajax call is made 56 | [string[]] 57 | $WhenRequestMade, 58 | 59 | # Runs one or more javascript functions when before an ajax call is made 60 | [string[]] 61 | $BeforeRequestMade, 62 | 63 | # Runs one or more javascript functions when an ajax call completes and has set a property 64 | [string[]] 65 | $ThenRun 66 | ) 67 | 68 | process { 69 | #region If no name is provided, generate one 70 | if (-not $psBoundParameters.Name) { 71 | $UrlFunctionName = $url.ToString() 72 | if ($urlFunctionName.Contains("?")) { 73 | $UrlFunctionName = $UrlFunctionName.Substring(0 ,$urlFunctionName.IndexOf("?")) 74 | } 75 | $UrlFunctionName = $UrlFunctionName.Replace("/","_slash_").Replace("\","_backslash_").Replace(":", "_colon_").Replace(".", "_dot_").Replace("-","_") 76 | $name = $UrlFunctionName 77 | } 78 | #endregion If no name is provided, generate one 79 | 80 | #region Determine the query data based off of the related controls 81 | $updateQueryData = "" 82 | if ($inputQuery) { 83 | for ($i = 0; $i -lt $InputQuery.Count; $i++) { 84 | if (@($inputId)[$i]) { 85 | $updateQueryData += " 86 | var element = document.getElementById('$($inputId[$i])') 87 | if (element != null && element.value.length != 0) 88 | { 89 | if (queryData.length > 0) { 90 | queryData = queryData + '&$($inputQuery[$i])=' + encodeURIComponent(document.getElementById('$($inputId[$i])').value); 91 | } else { 92 | queryData = '$($inputQuery[$i])=' + encodeURIComponent(document.getElementById('$($inputId[$i])').value); 93 | } 94 | } 95 | " 96 | } 97 | } 98 | } 99 | #endregion Determine the query data based off of the related controls 100 | if ($updateQueryData) { 101 | Write-Verbose $updateQueryData 102 | } 103 | 104 | $xmlHttpVar = "xmlHttp${$Name}" 105 | if (-not $psBoundParameters.Name) { 106 | $Name = "update${UpdateId}From_${Name}" 107 | } 108 | #region Code Generate the Ajax 109 | $ajaxFunction = @" 110 | function ${name}() { 111 | var $xmlHttpVar; 112 | var url = "$url"; 113 | var queryData = "$postData"; 114 | var method = '$($method.ToUpper())'; 115 | if (window.XMLHttpRequest) 116 | { 117 | // code for IE7+, FireFox, Chrome, Opera, Safari 118 | $xmlHttpVar = new XMLHttpRequest(); 119 | } else 120 | { 121 | // code for IE5, IE6 122 | $xmlHttpVar = new ActiveXObject("Microsoft.XMLHTTP"); 123 | } 124 | 125 | $updateQueryData 126 | 127 | element = document.getElementById("$UpdateId"); 128 | if (element.nodeName == 'IFRAME') { 129 | element.src = url 130 | } 131 | 132 | $xmlHttpVar.onreadystatechange = function() { 133 | if (${xmlHttpVar}.readyState == 4) { 134 | if (${xmlHttpVar}.status == 200) { 135 | 136 | responseData = $xmlHttpVar.responseText; 137 | $(if ($escape) { 'responseData = escape(responseData)'}) 138 | $(if ($WhenResultReceived) { $WhenResultReceived -join (';' + [Environment]::NewLine) + (' ' * 12) }) 139 | document.getElementById("$UpdateId").${UpdateProperty}= responseData; 140 | $(if ($thenRun) { $thenRun -join (';' + [Environment]::NewLine) + (' ' * 12) }) 141 | } else { 142 | document.getElementById("$UpdateId").${UpdateProperty}= $xmlHttpVar.Status; 143 | } 144 | } else { 145 | if (${xmlHttpVar}.readyState != 1) { 146 | document.getElementById("$UpdateId").${UpdateProperty}= $xmlHttpVar.readyState; 147 | } else { 148 | $(if ($WhenRequestMade) { $WhenRequestMade -join (';' + [Environment]::NewLine) + (' ' * 12) }) 149 | } 150 | } 151 | } 152 | $(if ($BeforeRequestMade) { $BeforeRequestMade -join (';' + [Environment]::NewLine) + (' ' * 12) }) 153 | 154 | if (method == 'POST') { 155 | $xmlHttpVar.open(method, url, true); 156 | $xmlHttpVar.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 157 | $xmlHttpVar.setRequestHeader("Content-length", queryData.length); 158 | $xmlHttpVar.setRequestHeader("Connection", "close"); 159 | $xmlHttpVar.send(queryData); 160 | } else { 161 | var fullUrl; 162 | if (url.indexOf('?') != -1) { 163 | fullUrl = url + '&' + queryData; 164 | } else { 165 | fullUrl = url + '?' + queryData; 166 | } 167 | $xmlHttpVar.open(method, fullUrl, true); 168 | $xmlHttpVar.send(); 169 | } 170 | 171 | } 172 | "@ 173 | #endregion Code Generate the Ajax 174 | if ($IncludeScriptTag) { 175 | @" 176 | <script type='text/javascript'> 177 | $ajaxFunction 178 | </script> 179 | "@ 180 | } else { 181 | $ajaxFunction 182 | } 183 | } 184 | } 185 | -------------------------------------------------------------------------------- /Write-CSS.ps1: -------------------------------------------------------------------------------- 1 | function Write-CSS 2 | { 3 | <# 4 | .Synopsis 5 | Writes CSS styles 6 | .Description 7 | Writes CSS style tags, CSS attributes, and links to external stylesheets 8 | .Example 9 | # Create a new CSS Style named reallyimportant 10 | Write-CSS -Name '#ReallyImportant' -Style @{ 11 | "font-size" = "x-large" 12 | "font-weight"="bold" 13 | } 14 | .Example 15 | Write-CSS -OutputAttribute -Style @{ 16 | "font-size" = "x-large" 17 | "font-weight"="bold" 18 | } 19 | .Example 20 | Write-CSS -ExternalStyleSheet MyStyleSheet.css 21 | .Example 22 | Write-CSS -Css @{ 23 | "a"=@{ 24 | "font-size"="x-large" 25 | } 26 | } 27 | .Link 28 | New-WebPage 29 | .Link 30 | Out-HTML 31 | .Link 32 | Write-Link 33 | #> 34 | [CmdletBinding(DefaultParameterSetName='StyleDefinition')] 35 | [OutputType([string])] 36 | param( 37 | # The name of the css style 38 | [Parameter(Mandatory=$true, 39 | Position=0, 40 | ValueFromPipelineByPropertyName=$true, 41 | ParameterSetName="StyleDefinition")] 42 | [string] 43 | $Name, 44 | 45 | # The css values for a named style or a style attribute 46 | [Parameter(Mandatory=$true, 47 | ValueFromPipelineByPropertyName=$true, 48 | Position=0, 49 | ParameterSetName="StyleAttribute")] 50 | [Parameter(Mandatory=$true, 51 | ValueFromPipelineByPropertyName=$true, 52 | Position=1, 53 | ParameterSetName="StyleDefinition")] 54 | [Hashtable] 55 | $Style, 56 | 57 | # A CSS table, containing nested tables of styles 58 | [Parameter(Mandatory=$true, 59 | ValueFromPipelineByPropertyName=$true, 60 | ParameterSetName="Table")] 61 | [Hashtable] 62 | $Css, 63 | 64 | # If set, will not output a style tag when outputting a CSS table. 65 | [Parameter( 66 | ValueFromPipelineByPropertyName=$true, 67 | ParameterSetName="Table")] 68 | [switch] 69 | $NoStyleTag, 70 | 71 | 72 | # A path to an external syle sheet 73 | [Parameter(Mandatory=$true, 74 | ValueFromPipelineByPropertyName=$true, 75 | ParameterSetName="StyleSheet")] 76 | [uri] 77 | $ExternalStyleSheet, 78 | 79 | # If set, will output the attributes of a style 80 | [Parameter(Mandatory=$true, 81 | ValueFromPipelineByPropertyName=$true, 82 | ParameterSetName="StyleAttribute")] 83 | [switch] 84 | $OutputAttribute 85 | ) 86 | 87 | process { 88 | if ($pscmdlet.ParameterSetName -eq 'StyleSheet') { 89 | "<link rel='stylesheet' type='text/css' href='$ExternalStyleSheet' />" 90 | } elseif ($pscmdlet.ParameterSetName -eq 'Table') { 91 | $cssLines = foreach ($kv in $css.GetEnumerator()) { 92 | $name = $kv.Key 93 | 94 | Write-CSS -Name $name -Style $kv.Value 95 | } 96 | "$(if (-not $NoStyleTag) { '<style type=''text/css''>' }) 97 | $cssLines 98 | $(if (-not $NoStyleTag) { '</style>'})" 99 | } elseif ($pscmdlet.ParameterSetName -eq 'StyleDefinition') { 100 | $cssText = foreach ($kv in $Style.GetEnumerator()) { 101 | "$($kv.Key):$($kv.Value)" 102 | } 103 | $cssText = $cssText -join ";$([Environment]::NewLine) " 104 | "$name { 105 | $cssText 106 | }" 107 | } elseif ($pscmdlet.ParameterSetName -eq 'StyleAttribute') { 108 | 109 | # Just in case they called the command with splatting, fall back on the keys 110 | # (which will not preserve order) 111 | 112 | @(foreach ($kv in $style.Keys) { 113 | if ($style[$kv]) { 114 | "$($kv):$($style[$kv])" 115 | } 116 | }) -join ';' 117 | 118 | } 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /Write-Host.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Write-Host.ps1 -------------------------------------------------------------------------------- /Write-PowerShellHashtable.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/Write-PowerShellHashtable.ps1 -------------------------------------------------------------------------------- /Write-ScriptHTML.ps1: -------------------------------------------------------------------------------- 1 | function Write-ScriptHTML 2 | { 3 | <# 4 | .Synopsis 5 | Writes Windows PowerShell as colorized HTML 6 | .Description 7 | Outputs a Windows PowerShell script as colorized HTML. 8 | The script is wrapped in HTML PRE tags with SPAN tags defining color regions. 9 | .Example 10 | Write-ScriptHTML {Get-Process} 11 | .Link 12 | ConvertFrom-Markdown 13 | #> 14 | [CmdletBinding(DefaultParameterSetName="Text")] 15 | [OutputType([string])] 16 | param( 17 | # The Text to colorize 18 | [Parameter(Mandatory=$true, 19 | ParameterSetName="Text", 20 | Position=0, 21 | ValueFromPipeline=$true)] 22 | [Alias('ScriptContents')] 23 | [ScriptBlock]$Text, 24 | 25 | 26 | # The script as a string. 27 | [Parameter(Mandatory=$true, 28 | ParameterSetName="ScriptString", 29 | Position=0, 30 | ValueFromPipelineByPropertyName=$true)] 31 | [string]$Script, 32 | 33 | # The start within the string to colorize 34 | [Int]$Start = -1, 35 | # the end within the string to colorize 36 | [Int]$End = -1, 37 | 38 | # The palette of colors to use. 39 | # By default, the colors will be the current palette for the 40 | # Windows PowerShell Integrated Scripting Environment 41 | $Palette = $Psise.Options.TokenColors, 42 | 43 | # If set, will include the script within a span instead of a pre tag 44 | [Switch]$NoNewline, 45 | 46 | # If set, will treat help within the script as markdown 47 | [Switch]$HelpAsMarkdown, 48 | 49 | # If set, will not put a white background and padding around the script 50 | [Switch]$NoBackground 51 | ) 52 | 53 | begin { 54 | #region Color Palettes 55 | function New-ScriptPalette 56 | { 57 | param( 58 | $Attribute = "#FFADD8E6", 59 | $Command = "#FF0000FF", 60 | $CommandArgument = "#FF8A2BE2", 61 | $CommandParameter = "#FF000080", 62 | $Comment = "#FF006400", 63 | $GroupEnd = "#FF000000", 64 | $GroupStart = "#FF000000", 65 | $Keyword = "#FF00008B", 66 | $LineContinuation = "#FF000000", 67 | $LoopLabel = "#FF00008B", 68 | $Member = "#FF000000", 69 | $NewLine = "#FF000000", 70 | $Number = "#FF800080", 71 | $Operator = "#FFA9A9A9", 72 | $Position = "#FF000000", 73 | $StatementSeparator = "#FF000000", 74 | $String = "#FF8B0000", 75 | $Type = "#FF008080", 76 | $Unknown = "#FF000000", 77 | $Variable = "#FFFF4500" 78 | ) 79 | 80 | process { 81 | $NewScriptPalette= @{} 82 | foreach ($parameterName in $myInvocation.MyCommand.Parameters.Keys) { 83 | $var = Get-Variable -Name $parameterName -ErrorAction SilentlyContinue 84 | if ($var -ne $null -and $var.Value) { 85 | if ($var.Value -is [Collections.Generic.KeyValuePair[System.Management.Automation.PSTokenType,System.Windows.Media.Color]]) { 86 | $NewScriptPalette[$parameterName] = $var.Value.Value 87 | } elseif ($var.Value -as [Windows.Media.Color]) { 88 | $NewScriptPalette[$parameterName] = $var.Value -as [Windows.Media.Color] 89 | } 90 | } 91 | } 92 | $NewScriptPalette 93 | } 94 | } 95 | #endregion Color Palettes 96 | Set-StrictMode -Off 97 | Add-Type -AssemblyName PresentationCore, PresentationFramework, System.Web 98 | } 99 | 100 | process { 101 | if (-not $Palette) { 102 | $palette = @{} 103 | } 104 | 105 | if ($psCmdlet.ParameterSetName -eq 'ScriptString') { 106 | $text = [ScriptBLock]::Create($script) 107 | } 108 | 109 | 110 | if ($Text) { 111 | # 112 | # Now parse the text and report any errors... 113 | # 114 | $parse_errs = $null 115 | $tokens = [Management.Automation.PsParser]::Tokenize($text, 116 | [ref] $parse_errs) 117 | 118 | if ($parse_errs) { 119 | $parse_errs | Write-Error 120 | return 121 | } 122 | $stringBuilder = New-Object Text.StringBuilder 123 | $backgroundAndPadding = 124 | if (-not $NoBackground) { 125 | "background-color:#fefefe;padding:5px" 126 | } else { 127 | "" 128 | } 129 | 130 | $null = $stringBuilder.Append("<$(if (-not $NoNewline) {'pre'} else {'span'}) class='PowerShellColorizedScript' style='font-family:Consolas;$($backgroundAndPadding)'>") 131 | # iterate over the tokens an set the colors appropriately... 132 | $lastToken = $null 133 | $ColorPalette = New-ScriptPalette @Palette 134 | $scriptText = "$text" 135 | $c = 0 136 | $tc = $tokens.Count 137 | foreach ($t in $tokens) 138 | { 139 | $C++ 140 | if ($c -eq $tc) { break } 141 | if ($lastToken) { 142 | $spaces = " " * ($t.Start - ($lastToken.Start + $lastToken.Length)) 143 | $null = $stringBuilder.Append($spaces) 144 | } 145 | if ($t.Type -eq "NewLine") { 146 | $null = $stringBuilder.Append(" 147 | ") 148 | } else { 149 | $chunk = $scriptText.SubString($t.start, $t.length).Trim() 150 | if ($t.Type -eq 'Comment' -and $HelpAsMarkdown) { 151 | if ($chunk -like "#*") { 152 | $chunk = $chunk.Substring(1) 153 | } 154 | $chunk = "<p>" + (ConvertFrom-Markdown -Markdown $chunk) + "</p>" 155 | } 156 | 157 | $color = $ColorPalette[$t.Type.ToString()] 158 | $redChunk = "{0:x2}" -f $color.R 159 | $greenChunk = "{0:x2}" -f $color.G 160 | $blueChunk = "{0:x2}" -f $color.B 161 | $colorChunk = "#$redChunk$greenChunk$blueChunk" 162 | $null = $stringBuilder.Append("<span style='color:$colorChunk'>$([Web.HttpUtility]::HtmlEncode($chunk).Replace('&','&').Replace('"','`"'))</span>") 163 | } 164 | $lastToken = $t 165 | } 166 | $null = $stringBuilder.Append("</$(if (-not $NoNewline) {'pre'} else {'span'})>") 167 | 168 | 169 | $stringBuilder.ToString() 170 | } 171 | } 172 | } 173 | -------------------------------------------------------------------------------- /Write-WalkthruHTML.ps1: -------------------------------------------------------------------------------- 1 | function Write-WalkthruHTML 2 | { 3 | <# 4 | .Synopsis 5 | Writes a walkthru HTML file 6 | .Description 7 | Writes a section of HTML to walk thru a set of code. 8 | .Example 9 | Write-WalkthruHTML -Text @" 10 | #a simple demo 11 | Get-Help about_walkthruFiles 12 | "@ 13 | .Link 14 | Get-Walkthru 15 | Write-ScriptHTML 16 | #> 17 | [CmdletBinding(DefaultParameterSetName='Text')] 18 | [OutputType([string])] 19 | param( 20 | # The text used to generate walkthrus 21 | [Parameter(Position=0,Mandatory=$true, 22 | ParameterSetName="Text", 23 | ValueFromPipeline=$true)] 24 | [ScriptBlock]$ScriptBlock, 25 | 26 | # A walkthru object, containing a source file and a property named 27 | # walkthru with several walkthru steps 28 | [Parameter(Position=0,Mandatory=$true, 29 | ParameterSetName="Walkthru", 30 | ValueFromPipeline=$true)] 31 | [PSObject]$WalkThru, 32 | 33 | # with a different step on each layer 34 | [Parameter(Position=1)] 35 | [Switch]$StepByStep, 36 | 37 | # If set, will run each demo step 38 | [Parameter(Position=2)] 39 | [Switch]$RunDemo, 40 | 41 | # If set, output will be treated as HTML. Otherwise, output will be piped to Out-String and embedded in <pre> tags. 42 | [Parameter(Position=3)] 43 | [Switch]$OutputAsHtml, 44 | 45 | # If set, will start with walkthru with a <h3></h3> tag, or include the walkthru name on each step 46 | [Parameter(Position=4)] 47 | [string]$WalkthruName, 48 | 49 | # If set, will embed the explanation as text, instead of converting it to markdown. 50 | [Parameter(Position=5)] 51 | [switch]$DirectlyEmbedExplanation, 52 | 53 | # If provided, will only include certain steps 54 | [Parameter(Position=6)] 55 | [Uint32[]]$OnlyStep 56 | ) 57 | 58 | process { 59 | if ($psCmdlet.ParameterSetName -eq 'Text') { 60 | Write-WalkthruHTML -Walkthru (Get-Walkthru -Text "$ScriptBlock") -StepByStep:$stepByStep 61 | } elseif ($psCmdlet.ParameterSetName -eq 'Walkthru') { 62 | $NewRegionParameters = @{ 63 | Layer = @{} 64 | Order = @() 65 | HorizontalRuleUnderTitle = $true 66 | } 67 | 68 | $walkThruHTML = New-Object Text.StringBuilder 69 | 70 | 71 | $count = 1 72 | $total = @($walkThru).Count 73 | foreach ($step in $walkThru) { 74 | 75 | # if it's provided, skip stuff that's not in OnlyStep 76 | if ($OnlySteps) { 77 | if ($OnlySteps -notcontains $count){ 78 | continue 79 | } 80 | } 81 | 82 | # If we're going step by step, then we need to reset the string builder each time 83 | if ($stepByStep) { 84 | $walkThruHTML = New-Object Text.StringBuilder 85 | } 86 | 87 | if ($DirectlyEmbedExplanation -or $step.Explanation -like "*<*") { 88 | 89 | $null = $walkThruHtml.Append(" 90 | 91 | <div class='ModuleWalkthruExplanation'> 92 | $($step.Explanation.Replace([Environment]::newline, '<BR/>')) 93 | </div>") 94 | } else { 95 | $null = $walkThruHtml.Append(" 96 | 97 | <div class='ModuleWalkthruExplanation'> 98 | $(ConvertFrom-Markdown -Markdown "$($step.Explanation) ") 99 | </div>") 100 | } 101 | if ($step.VideoFile -and $step.VideoFile -like "http*") { 102 | if ($step.VideoFile -like "http://www.youtube.com/watch?v=*") { 103 | $uri = $step.VideoFile -as [uri] 104 | $type, $youTubeId = $uri.Query -split '=' 105 | $type = $type.Trim("?") 106 | $null = 107 | $walkThruHtml.Append(@" 108 | <br/> 109 | <embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/${type}/${youTubeId}?hl=en&fs=1&modestbranding=true" allowscriptaccess="always" allowfullscreen="true"> 110 | "@) 111 | } elseif ($step.VideoFile -like "http://player.vimeo.com/video/*") { 112 | $vimeoId = ([uri]$step.VideoFile).Segments[-1] 113 | $null = 114 | $walkThruHtml.Append(@" 115 | <br/> 116 | <iframe src="http://player.vimeo.com/video/${vimeoId}?title=0&byline=0&portrait=0" width="400" height="245" frameborder="0"> 117 | </iframe><p><a href="http://vimeo.com/{$vimeoId}">$($walkThru.Explanation)</a></p> 118 | 119 | "@) 120 | } else { 121 | $null = 122 | $walkThruHtml.Append(" 123 | <br/> 124 | <a class='ModuleWalkthruVideoLink' href='$($step.VideoFile)'>Watch Video</a>") 125 | } 126 | } 127 | $null = $walkThruHtml.Append("<br/></p>") 128 | 129 | if (("$($step.Script)".Trim())-and ("$($step.Script)".Trim() -ne '$null')) { 130 | if ($step.Script -is [ScriptBlock]) { 131 | $scriptHtml = Write-ScriptHTML -Text $step.Script 132 | } else { 133 | $scriptHtml = Write-ScriptHTML -Script $step.Script 134 | } 135 | 136 | $null = $walkThruHtml.Append(@" 137 | <p class='ModuleWalkthruStep'> 138 | $scriptHtml 139 | </p> 140 | "@) 141 | } 142 | 143 | if ($RunDemo) { 144 | $outText = . $step.Script 145 | if (-not $OutputAsHtml) { 146 | $null = $walkThruHtml.Append("<pre class='ModuleWalkthruOutput' foreground='white' background='#012456'>$([Security.SecurityElement]::Escape(($outText | Out-String)))</pre>") 147 | } else { 148 | if ($outText -is [Hashtable]) { 149 | $null = $walkThruHtml.Append("$(Write-PowerShellHashtable -inputObject $OutText) ") 150 | } elseif ($outText -is [ScriptBlock]) { 151 | $null = $walkThruHtml.Append("$(Write-ScriptHtml -Text $OutText) ") 152 | } else { 153 | $null = $walkThruHtml.Append("$OutText") 154 | } 155 | 156 | } 157 | } 158 | if ($stepByStep) { 159 | $NewRegionParameters.Layer."$Count of $Total" = "<div style='margin-left:15px;margin-top:15px;'>$walkThruHTML</div>" 160 | $NewRegionParameters.Order+= "$Count of $Total" 161 | 162 | } 163 | $Count++ 164 | } 165 | 166 | if (-not $stepByStep) { 167 | "$walkThruHTML" 168 | } else { 169 | if ($WalkthruName) { 170 | New-Region @newRegionParameters -AsFeaturette -ShowLayerTitle -LayerId "Walkthru_$WalkthruName" 171 | } else { 172 | New-Region @newRegionParameters -AsFeaturette -ShowLayerTitle -LayerUrl "RandomWalkthru_$(Get-random)" 173 | } 174 | 175 | } 176 | 177 | 178 | 179 | } 180 | 181 | } 182 | } 183 | -------------------------------------------------------------------------------- /bin/Microsoft.Exchange.WebServices.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/bin/Microsoft.Exchange.WebServices.dll -------------------------------------------------------------------------------- /css/Pipeworks.less: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/css/Pipeworks.less -------------------------------------------------------------------------------- /en-us/A_Simple_Stockticker.walkthru.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/A_Simple_Stockticker.walkthru.help.txt -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_AdSense.help.txt: -------------------------------------------------------------------------------- 1 | The AdSense section of the Pipeworks manifest describes how AdSense ads will be added to a Pipeworks site. 2 | 3 | It is a hashtable, and contains: 4 | 5 | * An ID (your AdSense ID) 6 | * (Optionally) a BottomAdSlot, containing the ad slot you will display on the bottom of each page 7 | * (Optionally) a TopAdSlot, containing the ad slot you will display on the top of each page 8 | 9 | 10 | This is an example of a manifest containing only AdSense information: 11 | 12 | @{ 13 | AdSense = @{ 14 | Id = '7086915862223923' 15 | BottomAdSlot = '6352908833' 16 | } 17 | } 18 | 19 | 20 | See Also: 21 | 22 | * [/About_the_Pipeworks_Manifest_-_PubCenter](About The Pipeworks Manifest - PubCenter) -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_Ajax.help.txt: -------------------------------------------------------------------------------- 1 | The Ajax section of the Pipeworks manifest is boolean. By default, it's set to false. It instructs Pipeworks to use Ajax in forms. 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_AllowDownload.help.txt: -------------------------------------------------------------------------------- 1 | AllowDownload is a Pipeworks Manifest setting that will make the published module downloadable. 2 | 3 | 4 | If set, a zip file will be created containing the module and all of it's requirements. This zip file will also include an install.cmd, and, optionally, a shortcut installer. The published module will contain a link "Download" that will download the .zip file. 5 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_AmazonPaymentsAccountId.help.txt: -------------------------------------------------------------------------------- 1 | The Amazon Payments Account ID. At this point, due to breaking changes in Amazon web stores, Amazon payment is not supported in Pipeworks. 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_AnalyticsID.help.txt: -------------------------------------------------------------------------------- 1 | The Pipeworks setting AnalyticsID is a Google Analytics ID tracker. If provided, this will be placed on every page in the module. 2 | 3 | 4 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_Antisocial.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/About_the_Pipeworks_Manifest_-_Antisocial.help.txt -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_AppPoolPasswordSetting.help.txt: -------------------------------------------------------------------------------- 1 | The AppPoolPassWordSetting defines a SecureSetting that contains the password for the AppPool user. 2 | 3 | 4 | If this and AppPoolUser are provided, the module will be published under a specific app pool user account. This can be very useful for Intranet modules that need to run as a particular user. 5 | 6 | See Also: 7 | 8 | 9 | * [AppPoolUser](/About_the_Pipeworks_Manifest_-_AppPoolUser/) 10 | * [Scripting Securely with SecureSettings](/Scripting_Securely_with_SecureSettings/) 11 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_AppPoolUser.help.txt: -------------------------------------------------------------------------------- 1 | The AppPoolUser defines a SecureSetting that contains the password for the AppPool user. 2 | 3 | 4 | If this and AppPoolPasswordSetting are provided, the module will be published under a specific app pool user account. This can be very useful for Intranet modules that need to run as a particular user. 5 | 6 | See Also: 7 | 8 | 9 | * [AppPoolPasswordSetting](/About_the_Pipeworks_Manifest_-_AppPoolPasswordSetting/) 10 | 11 | 12 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_AsIntranetSite.help.txt: -------------------------------------------------------------------------------- 1 | If AsIntranetSite is set, the site will be published as an Intranet site. Anonymous Authentication will be turned off, and Windows Authentication will be turned on. 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_BingValidationKey.help.txt: -------------------------------------------------------------------------------- 1 | The BingValidationKey will add a Bing Webmaster Tools validation key to each page. This will enable you to use the site with [Bing Webmaster Tools](http://www.bing.com/toolbox/webmaster) 2 | 3 | 4 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_Blog.help.txt: -------------------------------------------------------------------------------- 1 | The Blog Pipeworks Manifest setting is a hashtable that describes RSS feed information about the site. 2 | 3 | 4 | If provided, the home page will have a link to the blog's RSS feed, and the page will contain the appropriate metadata for search engines. 5 | 6 | If only a name and a description are provided, a feed will be automatically provided by the module's topics. 7 | 8 | Additionally, the Blog section can be used with the Blog Schematic 9 | 10 | Here is an example of a completed blog section that uses the built-in RSS feed: 11 | 12 | 13 | Blog = @{ 14 | Name = "Start-Scripting" 15 | Description = "Stop-WastingTime. Start-Scripting -with PowerShell" 16 | } 17 | 18 | Here is an example that uses it's own feed: 19 | 20 | 21 | Blog = @{ 22 | Name = "Start-Scripting" 23 | Description = "Stop-WastingTime. Start-Scripting -with PowerShell" 24 | Link = "http://blog.start-automating.com/" 25 | } 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_Bootstrap.help.txt: -------------------------------------------------------------------------------- 1 | BootStrap (or UseBootStrap) instructs Pipeworks to use Twitter Bootstrap to build a site. 2 | 3 | 4 | If the theme is not present, this will download a twitter bootstrap theme according using color scheme specified in the Style section of the Pipeworks manifest. To refresh the them, delete bootstrap.js from the JS directory of the module and republish. 5 | 6 | 7 | Using Bootstrap enables many features within Pipeworks, and changes the default layout. It enables a navbar that links to the topics and commands in the module. It also changes the deault view to a set of HangingSpans, which will expand out when clicked. 8 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_Branding.help.txt: -------------------------------------------------------------------------------- 1 | The branding section of the Pipeworks manifest describes the branding displayed on each page. 2 | 3 | By default, this will display a link to Start-Automating and to PowerShell Pipeworks. 4 | 5 | It can be blank, or can contain any HTML or Markdown you'd like. 6 | 7 | 8 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_CommandOrder.help.txt: -------------------------------------------------------------------------------- 1 | The CommandOrder is a list of strings, and it determines the order commands will be displayed (if there commands are not grouped). By default, commands will be alphabetized. 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_CommandTemplate.help.txt: -------------------------------------------------------------------------------- 1 | The CommandTemplate is the PowerShell web template (.pswt) used to display each command in the site. A .pswt allows you to customize the look and feel of a pipeworks page. It directly replaces variable names within the page. By default, this is set to Command.pswt. 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_CommandTrigger.help.txt: -------------------------------------------------------------------------------- 1 | The CommandTrigger section of the PipeworksManifest describes when commands will be triggered on a device. At current, only one setting is supported: Shake. 2 | 3 | 4 | Here is an example of a Pipeworks manifest with a CommandTrigger section: 5 | 6 | @{ 7 | CommandTrigger = @{ 8 | "Shake" = "Get-RandomPowerShellTip" 9 | } 10 | } 11 | 12 | 13 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_Css.help.txt: -------------------------------------------------------------------------------- 1 | The CSS section of the pipeworks manifest describes CSS style pages to use with each page. 2 | 3 | 4 | It is a hashtable, with the key describing the style page and the value containing the path to the page. 5 | 6 | 7 | Here's a quick example of the CSS section: 8 | 9 | @{ 10 | Css = @{ 11 | "PowerShellStyleSheet" = "/CSS/Gangamstyle.css" 12 | } 13 | } 14 | 15 | 16 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_DefaultCommand.help.txt: -------------------------------------------------------------------------------- 1 | The DefaultCommand section of the Pipeworks manifest describes the command that will run by default when a user visits the page. 2 | 3 | 4 | It is a hashtable, and must contain the name of the command. It may contain a nested hashtable called Parameter, which will provide parameters to the command. 5 | 6 | 7 | DefaultCommands do not need to be registered as web commands, since they cannot accept open-ended input. 8 | 9 | 10 | Here is an example: 11 | 12 | 13 | @{ 14 | DefaultCommand = @{ 15 | Name = 'Get-RandomPowerShellTip' 16 | } 17 | } -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_DefaultTemplate.help.txt: -------------------------------------------------------------------------------- 1 | The Default Template describes the PowerShell Web Template (.pswt) used to display the main page. A .pswt allows you to customize the look and feel of a pipeworks page. It directly replaces variable names within the page. By default, this is set to Default.pswt. 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_DomainSchematics.help.txt: -------------------------------------------------------------------------------- 1 | The DomainSchematics section describes how the Pipeworks module will be published. It is a hashtable, containing a series of domains and a list of schematics to use while publishing. 2 | 3 | 4 | A site can be published to multiple domains. To do this, separate each item with a | 5 | 6 | 7 | Here's an example of a site that would be published to 4 different URLs, using the default schematic: 8 | 9 | @{ 10 | DomainSchematics = @{ 11 | "StartLearningPowerShell.com | Start-LearningPowershell.com | www.Start-LearningPowershell.com | www.StartLearningPowerShell.com" = 12 | "Default" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_Download.help.txt: -------------------------------------------------------------------------------- 1 | Download is a Hashtable of files that will be downloaded when the module is published. The key of the hashtable is the URL, and the value is the local path of the downloaded file, relative to the output directory. 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_ExecutionTimeout.help.txt: -------------------------------------------------------------------------------- 1 | The ExecutionTimeout allows you to customize the ASP.Net execution timeout for each page. 2 | 3 | The value must be a string that can be a timespan (for instance: '00:02:00'). 4 | 5 | By default, the timeout is 2 minutes. 6 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_Facebook.help.txt: -------------------------------------------------------------------------------- 1 | The facebook section adds facebook like links, and allows using Facebook as an authentication method. It is a hashtable, and contains the AppId: 2 | 3 | 4 | Here is an example: 5 | 6 | @{ 7 | Facebook = @{ 8 | AppId = '452858484777409' 9 | } 10 | } 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_GitIt.help.txt: -------------------------------------------------------------------------------- 1 | GitIt describes projects to pull from Git prior to deployment. 2 | 3 | 4 | See Also: 5 | 6 | * [Getting GitIt](/Getting_GitIt/) 7 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_GoogleMerchantId.help.txt: -------------------------------------------------------------------------------- 1 | If provided the GoogleMerchantID can add Google Checkout integration for items on a page. Any products rendered within the page will include Google Checkout links. 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_GoogleSiteVerification.help.txt: -------------------------------------------------------------------------------- 1 | The GoogleSiteVerification setting of the Pipeworks Manifest allows adds site verification tags for Google WebMaster Tools. It also adds a +1 button to each page, until AntiSocial is specified. 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_Group.help.txt: -------------------------------------------------------------------------------- 1 | The Group describes how commands and topics will be displayed on the front page and in menus throughout the site. 2 | 3 | 4 | It is a list of hashtables, displayed in order. The key of each item in the hashtable will the name of the group. The value will be a list of commands or topics within the group. 5 | 6 | 7 | For example, here's the Group section for Pipeworks: 8 | 9 | 10 | @{ 11 | Group = @{ 12 | "Getting Started" = "About PowerShell Pipeworks", "Pipeworks Quickstart", "The Pipeworks Manifest", 'From Script To Software Service', "Powerful Powershell Formatting", "Scripting Securely with SecureSettings", "NOHtml Sites", "A Simple StockTicker", "Creating a CitiBike Station Finder" 13 | }, @{ 14 | "Play with Pipeworks" = "Write-ASPDotNetScriptPage", "ConvertFrom-Markdown", "Making Editing Easier With Markdown", "Write-Crud", "Write-ScriptHTML", "Making Tables with Out-HTML", "Working with Write-Link" 15 | }, @{ 16 | "Connecting the Clouds" = "Building with Bootstrap", "Get-Paid with Stripe", "Getting GitIt", "Get-Web Content From Anywhere", "Pick up the Phone with Pipeworks", "Implicit Texting with Twilio", "The Wonders of Wolfram Alpha","JQueryUI in Pipeworks", 'New-WebPage And JQuery', 'New-Region And JQueryUI', "Pipeworks Writes CRUD", "Managing Amazon Web Services with PowerShell Pipeworks", "Using Azure Table Storage in Pipeworks", "Publishing Pipeworks to Azure", 'Looking Up Locations With Resolve-Location', 'Simplifying Slideshows' 17 | }, @{ 18 | "Join Windows and Web" = "Why Windows", "Scripting with Superglue", "Integrated Intranet", "Simpler SEO" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_HiddenTopic.help.txt: -------------------------------------------------------------------------------- 1 | HiddenTopic (or HiddenTopics) is a list of topics that will be hidden from normal view. You can still visit the topic page directly to visit the topic, but it will not show up in menus. 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_HideUngrouped.help.txt: -------------------------------------------------------------------------------- 1 | If HideUngroupedHelp is set, topics that are not in a Group will not be displayed in menus. 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_IgnoreBuiltInCommand.help.txt: -------------------------------------------------------------------------------- 1 | If set, then built in commands cannot be used within a Pipeworks module (only commands from the current module can be). If not set, any command can be accessed via URL. If the command is not set in WebCommand, the help handler will be used. This is why [http://powershellpipeworks.com/Get-ChildItem/](http://powershellpipeworks.com/Get-ChildItem/) works, and isn't a threat. 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_InnerRegion.help.txt: -------------------------------------------------------------------------------- 1 | The InnerRegion is a Pipeworks Manifest setting that describes how the inner regions within a group will be rendered. It is as Hashtable, and the input in the Hashtable will be provided to the New-Region command. 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_JQueryUITheme.help.txt: -------------------------------------------------------------------------------- 1 | The JQueryUITheme describes the them used for JQueryUI. This can be any theme on the default CDNs, or 'Custom', which will use a theme located in the 'custom' directory. You can build the theme using [JQueryUI's ThemeRoller](http://jqueryUI.com/themeroller/). 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_JavaScript.help.txt: -------------------------------------------------------------------------------- 1 | The Javascript section of the Pipeworks manifest lists javascript files to include on all pages. 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_Keyword.help.txt: -------------------------------------------------------------------------------- 1 | The keyword setting of the Pipeworks manifest contains a list of search keywords to add to each page of the site. 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_LiveConnect.help.txt: -------------------------------------------------------------------------------- 1 | The LiveConnect section of the Pipeworks manifest describes Live Connect application data. 2 | 3 | 4 | It contains the ClientID of the app, as well as a secure setting pointing to the Client Secret Key. 5 | 6 | 7 | Here is an example: 8 | 9 | 10 | @{ 11 | LiveConnect = @{ 12 | ClientId = '00000000440DBD88' 13 | ClientSecretSetting = 'StartLearningPowerShellLiveSecret' 14 | } 15 | } 16 | 17 | 18 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_Logo.help.txt: -------------------------------------------------------------------------------- 1 | The logo of the pipeworks manifest is a URL to a logo file to use on all pages. The url should be root-relative (i.e. /Assets/Logo.png) 2 | 3 | Here is an example: 4 | 5 | @{ 6 | Logo = "/Assets/PowershellPipeworks_150.png" 7 | } 8 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_MainRegion.help.txt: -------------------------------------------------------------------------------- 1 | The InnerRegion is a Pipeworks Manifest setting that describes how the main region of a page will be rendered. It is as Hashtable, and the input in the Hashtable will be provided to the New-Region command. 2 | 3 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_MaximumRequestLength.help.txt: -------------------------------------------------------------------------------- 1 | The Maximum Request Length describes the maximum length of a request to an ASP.NET page. 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_MemberTopic.help.txt: -------------------------------------------------------------------------------- 1 | The MemberTopics section is a list of strings, and it describes topics only visible to a person after they have logged in. 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_ModuleTemplate.help.txt: -------------------------------------------------------------------------------- 1 | The moduleTemplate is the PowerShell web template (.pswt) used to display the core module page. A .pswt allows you to customize the look and feel of a pipeworks page. It directly replaces variable names within the page. By default, this is set to Module.pswt. 2 | 3 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_Nest.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/About_the_Pipeworks_Manifest_-_Nest.help.txt -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_Organization.help.txt: -------------------------------------------------------------------------------- 1 | The Organization section describes information about the publishing organization, and adds some contact information to each page. 2 | 3 | 4 | This example adds a phone number and an email link: 5 | 6 | @{ 7 | Organization = @{ 8 | Telephone = "+1(206)607-6555" 9 | Email = "info@start-automating.com" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_PaymentProcessing.help.txt: -------------------------------------------------------------------------------- 1 | The Payment Processing section describes how the site will tie into various example platforms. This is required for Cost to work on commands. 2 | 3 | 4 | This example will setup payments via PayPal for the email sales@start-automating.com 5 | 6 | @{ 7 | PaymentProcessing = @{ 8 | PaypalEmail = 'sales@start-automating.com' 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_PoolSize.help.txt: -------------------------------------------------------------------------------- 1 | The PoolSize sets the number of RunspacePools set up to handle requests. The default is 2. The more runspace pools used, the more memory your site will consume, and the more users it can handle at the same time. 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_Port.help.txt: -------------------------------------------------------------------------------- 1 | The Port setting of the Pipeworks manifest determines what port to use when publishing the site as an Intranet site. 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_PrivacyPolicy.help.txt: -------------------------------------------------------------------------------- 1 | The PrivacyPolicy setting of the Pipeworks manifest contains any legal privacy policy required. If none is provided, a default privacy policy will be used. 2 | 3 | 4 | For an example of this default, visit [http://powershellpipeworks.com/?ShowPrivacyPolicy=true](http://powershellpipeworks.com/?ShowPrivacyPolicy=true) 5 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_PubCenter.help.txt: -------------------------------------------------------------------------------- 1 | The PubCenter section of the Pipeworks manifest describes how PubCenter ads will be placed in a Win8 application. 2 | 3 | 4 | Like the AdSense section, it requires an ID, and a BottomAdSlot or TopAdSlot are supported: 5 | 6 | 7 | Here's an example: 8 | 9 | @{ 10 | PubCenter = @{ 11 | ApplicationId = "1b9271e7-0be4-4ef1-84c3-9e8f921c1b4a" 12 | BottomAdUnit = "10048228" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_PublishDirectory.help.txt: -------------------------------------------------------------------------------- 1 | The PublishDirectory setting in the Pipeworks manifest describes where the module should be published. By default, it will be published beneath c:\inetpub\wwwroot 2 | 3 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_Schema.help.txt: -------------------------------------------------------------------------------- 1 | The schema section of the Pipeworks manifest describes itemdata schemas used on the page. This is useful for making your site HTML5 compliant, and also for allowing people to interact more reliably with the site by using Get-Web -AsMicrodata 2 | 3 | 4 | Here's an example that declares a few schemas: 5 | 6 | @{ 7 | Schema = @{ 8 | GamerAchievementInfo = @{ 9 | Name='GamerAchievementInfo' 10 | PSTypeName='http://shouldbeonschema.org/Class' 11 | Url = 'http://UnlockAchievement.com/GamerAchievementInfo/' 12 | Property = @{ 13 | Name='Name' 14 | DeclaringType = 'http://schema.org/Thing' 15 | PSTypeName='http://shouldbeonschema.org/Property' 16 | Description='The name of the item.' 17 | }, @{ 18 | Name='Description' 19 | DeclaringType = 'http://schema.org/Thing' 20 | PSTypeName='http://shouldbeonschema.org/Property' 21 | Description='A short description of the item.' 22 | }, @{ 23 | Name='Image' 24 | DeclaringType = 'http://schema.org/Thing' 25 | PSTypeName='http://shouldbeonschema.org/Property' 26 | Description='URL of an image of the item.' 27 | TypeName = 'Url' 28 | }, @{ 29 | Name='Url' 30 | DeclaringType = 'http://schema.org/Thing' 31 | PSTypeName='http://shouldbeonschema.org/Property' 32 | Description='The namespace the class is defined in.' 33 | TypeName = 'Url' 34 | }, @{ 35 | Name='GamerTag' 36 | PSTypeName='http://shouldbeonschema.org/Property' 37 | Description='The gamertag or ID of an the gamer' 38 | TypeName = 'Url' 39 | }, @{ 40 | Name='Games' 41 | PSTypeName='http://shouldbeonschema.org/Property' 42 | Description='A list of games the gamer owns or has played' 43 | TypeName = 'http://UnlockAchievement.com/GameAchievementInfo' 44 | } 45 | 46 | Description="Achievement information for a gamer." 47 | 48 | ParentClass = @{ 49 | Name = 'Thing' 50 | Url = 'http://schema.org/Thing' 51 | PSTypeName = 'http://shouldbeonschema.org/Class' 52 | } 53 | } 54 | 55 | GameAchievementInfo = @{ 56 | Name='GameAchievementInfo' 57 | PSTypeName='http://shouldbeonschema.org/Class' 58 | Url = 'http://UnlockAchievement.com/GameAchievementInfo/' 59 | Description="Achievement information for a game." 60 | 61 | ParentClass = @{ 62 | Name = 'Thing' 63 | Url = 'http://schema.org/Thing' 64 | PSTypeName = 'http://shouldbeonschema.org/Class' 65 | } 66 | 67 | 68 | 69 | Property = @{ 70 | Name='Name' 71 | DeclaringType = 'http://schema.org/Thing' 72 | PSTypeName='http://shouldbeonschema.org/Property' 73 | Description='The name of the item.' 74 | }, @{ 75 | Name='Description' 76 | DeclaringType = 'http://schema.org/Thing' 77 | PSTypeName='http://shouldbeonschema.org/Property' 78 | Description='A short description of the item.' 79 | }, @{ 80 | Name='Image' 81 | DeclaringType = 'http://schema.org/Thing' 82 | PSTypeName='http://shouldbeonschema.org/Property' 83 | Description='URL of an image of the item.' 84 | TypeName = 'Url' 85 | }, @{ 86 | Name='Url' 87 | DeclaringType = 'http://schema.org/Thing' 88 | PSTypeName='http://shouldbeonschema.org/Property' 89 | Description='The namespace the class is defined in.' 90 | TypeName = 'Url' 91 | }, @{ 92 | Name='PossibleScore' 93 | PSTypeName='http://shouldbeonschema.org/Property' 94 | Description='The possible score for a game' 95 | TypeName = 'Integer' 96 | }, @{ 97 | Name='MyScore' 98 | PSTypeName='http://shouldbeonschema.org/Property' 99 | Description='My score for a game' 100 | TypeName = 'Integer' 101 | }, @{ 102 | Name='PercentComplete' 103 | PSTypeName='http://shouldbeonschema.org/Property' 104 | Description='The percent of achievements unlocked for the game' 105 | TypeName = 'Float' 106 | } 107 | } 108 | 109 | 110 | } 111 | } -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_SecureSetting.help.txt: -------------------------------------------------------------------------------- 1 | The SecureSetting section of the Pipeworks manifest is a list of SecureSettings that will be copied into the web.config when the module is published. Get-SecureSetting will retreive these settings when used inside of a website. This enables seamless secure scripting between a development environment and a published page. 2 | 3 | 4 | See also: 5 | 6 | * [Scripting Securely with SecureSettings](/Scripting_Securely_with_SecureSettings/) 7 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_ShortCut.help.txt: -------------------------------------------------------------------------------- 1 | The shortcut section of the Pipeworks manifest describes local shortcuts to add to the Start Menu when the module is installed. This enables easier use of PowerShell built tools by everyday users, and easy access to online help for a module. 2 | 3 | 4 | Here's an example: 5 | 6 | @{ 7 | Shortcut = @{ 8 | "Asset Inventory Tool" = "Show-Asset -Show" 9 | "Help" = "http://startlearningpowershell.com" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_ShowTweet.help.txt: -------------------------------------------------------------------------------- 1 | If the the ShowTweet setting is provided in the Pipeworks Manifest, each page will show a Tweet this link on each page. This setting can be overridden by using AntiSocial. 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_SimplePages.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/About_the_Pipeworks_Manifest_-_SimplePages.help.txt -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_SlideShow.help.txt: -------------------------------------------------------------------------------- 1 | The SlideShow section of the Pipeworks manifest describes a SlideShow that will be played on the landing page. SlideShow items may be HTML or image links. 2 | 3 | Here's an example: 4 | 5 | @{ 6 | Slideshow = @{ 7 | Slides = "/Assets/Screenshot_NowPlaying.png", 8 | "/Assets/screenshot_DJMode.png", 9 | "/Assets/Screenshot_PlayingAndRaining.png", 10 | "/Assets/Screenshot_KaraokeMode.png", 11 | "/Assets/screenshot_Raining.png", 12 | "/Assets/Screenshot_VisualSearch.png", 13 | "/Assets/Screenshot_Edit_Lyrics.png", 14 | "/Assets/Screenshot_EditMetaData.png", 15 | "/Assets/Screenshot_PlayingAndRaining.png" 16 | } 17 | } -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_Stealth.help.txt: -------------------------------------------------------------------------------- 1 | If the Stealth setting is provided in the Pipeworks Manifest, the module will not generate a robots.txt or sitemap.xml, and all pages will include meta information dissuading search engines from crawling the page. 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_Style.help.txt: -------------------------------------------------------------------------------- 1 | The Style section of the Pipeworks manifest declares a CSS style to use on each page. It is also used to provide color scheme information when generating a bootstrap theme or Win8 app. 2 | 3 | This section is almost exactly like CSS, except that nesting happens with Hashtables, not whitespace, and =, not : is used to separate values. 4 | 5 | 6 | Here's a simple sample: 7 | 8 | @{ 9 | Style = @{ 10 | Body = @{ 11 | "font-family" = "Segoe UI" 12 | "font-size" = "1.05em" 13 | 14 | "background-color" = "#FFFFFF" 15 | "color" = "#09952E" 16 | } 17 | 'a' = @{ 18 | 'color' = "#09952E" 19 | } 20 | } 21 | 22 | } 23 | 24 | 25 | Here is a more comple example: 26 | 27 | @{ 28 | Style = @{ 29 | body = @{ 30 | "font-family" = "'Segoe UI', 'Segoe UI Symbol', Helvetica, Arial, sans-serif" 31 | 'font-size' = "1.1em" 32 | 'color' = '#0248B2' 33 | 'background-color' = '#FFFFFF' 34 | } 35 | 'a' = @{ 36 | 'color' = '#012456' 37 | } 38 | 39 | '.MajorMenuItem' = @{ 40 | 'font-size' = 'large' 41 | } 42 | '.MinorMenuItem' = @{ 43 | 'font-size' = 'medium' 44 | } 45 | '.ExplanationParagraph' = @{ 46 | 'font-size' = 'medium' 47 | 'text-indent' = '-10px' 48 | } 49 | '.ModuleWalkthruExplanation' = @{ 50 | 'font-size' = 'medium' 51 | 'margin-right' = '3%' 52 | } 53 | 54 | '.ModuleWalkthruOutput' = @{ 55 | 'font-size' = 'medium' 56 | } 57 | '.PowerShellColorizedScript' = @{ 58 | 'font-size' = 'medium' 59 | } 60 | 61 | } 62 | } -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_Table.help.txt: -------------------------------------------------------------------------------- 1 | The Table section of the Pipeworks manifest describes information stored in a public azure table that the module service can access. 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_Template.help.txt: -------------------------------------------------------------------------------- 1 | The template setting of the Pipeworks manifest describes a PowerShell web template (.pswt) to use for each page on the site. 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_TopicTemplate.help.txt: -------------------------------------------------------------------------------- 1 | The TopicTemplate is the PowerShell web template (.pswt) used to display each command in the site. A .pswt allows you to customize the look and feel of a pipeworks page. It directly replaces variable names within the page. By default, this is set to Topic.pswt. 2 | 3 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_TrustedWalkthrus.help.txt: -------------------------------------------------------------------------------- 1 | The TrustedWalkthrus list is a set of walkthrus that the site trusts enough to run. These walkthrus should run quickly, not require user input, not require elevation, and yet be helpful in demonstrating functionality. 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_Tweet.help.txt: -------------------------------------------------------------------------------- 1 | If the Pipeworks Manifest includes the Tweet setting, a tweet this link will be added to each page. This setting can be overridden with .AntiSocial. 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_TwitterId.help.txt: -------------------------------------------------------------------------------- 1 | If the Pipeworks Manifest includes the TwitterID setting, a follow for that TwitterID will be added to each page. This setting can be overridden with .AntiSocial. 2 | 3 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_UseBootstrap.help.txt: -------------------------------------------------------------------------------- 1 | BootStrap (or UseBootStrap) instructs Pipeworks to use Twitter Bootstrap to build a site. 2 | 3 | 4 | If the theme is not present, this will download a twitter bootstrap theme according using color scheme specified in the Style section of the Pipeworks manifest. To refresh the them, delete bootstrap.js from the JS directory of the module and republish. 5 | 6 | 7 | Using Bootstrap enables many features within Pipeworks, and changes the default layout. It enables a navbar that links to the topics and commands in the module. It also changes the deault view to a set of HangingSpans, which will expand out when clicked. 8 | 9 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_UseGRaphael.help.txt: -------------------------------------------------------------------------------- 1 | If UseGraphael is provided in the Pipeworks manifest, Pipeworks will download [GRaphael](http://g.raphaeljs.com/) for the creation of graphs within the page. 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_UseJQuery.help.txt: -------------------------------------------------------------------------------- 1 | If UseJQuery is provided, JQuery will be downloaded and used in each page in the site. 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_UseJQueryUI.help.txt: -------------------------------------------------------------------------------- 1 | If UseJQueryUI is set to true in the Pipeworks manifest, JQueryUI will be used throughout the site. 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_UseRaphael.help.txt: -------------------------------------------------------------------------------- 1 | If UseGraphael is provided in the Pipeworks manifest, Pipeworks will download [Raphael](http://raphaeljs.com/) for the creation of graphs within the page. 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_UseShiv.help.txt: -------------------------------------------------------------------------------- 1 | If UseShiv is provided, the HTML5 shiv tool for IE will be downloaded, and installed on each page. 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_UseTableSorter.help.txt: -------------------------------------------------------------------------------- 1 | If UseTableSorter is provided, the TableSorter JQuery plugin will be downloaded, and used on each page. 2 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_UserTable.help.txt: -------------------------------------------------------------------------------- 1 | The UserTable section of the Pipeworks manifest describes how users of a site will be stored in Azure Table Storage. 2 | 3 | Here's an example (from the site [StartLearningPowerShell.com](http://start-learningpowershell.com/) 4 | 5 | @{ 6 | UserTable = @{ 7 | Name = 'StartLearningPowerShellUsers' 8 | Partition = 'Users' 9 | StorageAccountSetting = 'AzureStorageAccountName' 10 | StorageKeySetting = 'AzureStorageAccountKey' 11 | } 12 | } -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_WebCommand.help.txt: -------------------------------------------------------------------------------- 1 | The WebCommand section of the Pipeworks manifest describes which commands will be usable as web services, and what options to use when running a command. 2 | 3 | It is a hashtable of hashtables, where the key of each hashtable is the name of the command and the value is a hashtable containing parameters for the command Invoke-WebCommand. 4 | 5 | 6 | This is the WebCommand section of the Pipework's manifest: 7 | 8 | @{ 9 | WebCommand = @{ 10 | "Write-Link" = @{ 11 | HideParameter = "AmazonAccessKey", "AmazonSecretKey", "AmazonReturnUrl", "AmazonInputUrl", 12 | "AmazonIpnUrl", "UseOAth", "CollectShippingAddress", "AmazonAbandonUrl", "ToFacebookLogin", 13 | "FacebookAppId", "ModuleServiceUrl", "FacebookLoginScope", "AmazonPaymentsAccountID", "GoogleCheckoutMerchantID", "SortedLinkTable" 14 | PlainOutput = $true 15 | 16 | } 17 | "New-PipeworksManifest" = @{ 18 | ContentType = 'text/plain' 19 | } 20 | 21 | 22 | "ConvertFrom-Markdown" = @{ 23 | ParameterAlias = @{ 24 | 'm' = 'Markdown' 25 | 'md' = 'Markdown' 26 | } 27 | FriendlyName = "Mess With Markdown" 28 | HideParameter = 'Splat' 29 | } 30 | 31 | "Write-ScriptHTML" = @{ 32 | 33 | PlainOutput = $true 34 | HideParameter = @('Palette', 'Start', 'End', 'Script') 35 | ParameterOrder = 'Text' 36 | ParameterAlias = @{ 37 | 't'= 'Text' 38 | 39 | } 40 | FriendlyName = "Show Scripts as HTML" 41 | } 42 | "Write-ASPDotNetScriptPage" = @{ 43 | 44 | ContentType = "text/plain" 45 | HideParameter = @('MasterPage', 'CodeFile', 'Inherit', 'RunScriptMethod', 'FileName') 46 | FriendlyName = "PowerShell in ASP.NET" 47 | } 48 | 49 | "Write-Crud" = @{ 50 | ContentType = "text/plain" 51 | PlainOutput = $true 52 | } 53 | 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /en-us/About_the_Pipeworks_Manifest_-_WebWalkthrus.help.txt: -------------------------------------------------------------------------------- 1 | The WebWalkthrus setting of the Pipeworks manifest lists walkthrus whose output should be considered HTML. Each WebWalkthru should also be in the Trusted Walkthru list. If a trusted walkthru runs, and is not in WebWalkthrus, it's result will be piped into Out-HTML. 2 | -------------------------------------------------------------------------------- /en-us/Building_With_Bootstrap.walkthru.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/Building_With_Bootstrap.walkthru.help.txt -------------------------------------------------------------------------------- /en-us/Building_with_Blob_Storage.walkthru.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/Building_with_Blob_Storage.walkthru.help.txt -------------------------------------------------------------------------------- /en-us/Creating_a_CitiBike_Station_Finder.walkthru.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/Creating_a_CitiBike_Station_Finder.walkthru.help.txt -------------------------------------------------------------------------------- /en-us/From_Script_To_Software_Service.Walkthru.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/From_Script_To_Software_Service.Walkthru.help.txt -------------------------------------------------------------------------------- /en-us/Get-Paid_with_Stripe.walkthru.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/Get-Paid_with_Stripe.walkthru.help.txt -------------------------------------------------------------------------------- /en-us/Get-Web_Content_From_Anywhere.walkthru.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/Get-Web_Content_From_Anywhere.walkthru.help.txt -------------------------------------------------------------------------------- /en-us/Getting_GitIt.walkthru.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/Getting_GitIt.walkthru.help.txt -------------------------------------------------------------------------------- /en-us/Getting_Started_With_Pipeworks.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/Getting_Started_With_Pipeworks.md -------------------------------------------------------------------------------- /en-us/Implicit_Texting_With_Twilio.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/Implicit_Texting_With_Twilio.help.txt -------------------------------------------------------------------------------- /en-us/Integrated_Intranet.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/Integrated_Intranet.help.txt -------------------------------------------------------------------------------- /en-us/JQueryUI_In_Pipeworks.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/JQueryUI_In_Pipeworks.help.txt -------------------------------------------------------------------------------- /en-us/Looking_Up_Locations_With_Resolve-Location.walkthru.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/Looking_Up_Locations_With_Resolve-Location.walkthru.help.txt -------------------------------------------------------------------------------- /en-us/Making_Editing_Easier_With_Markdown.walkthru.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/Making_Editing_Easier_With_Markdown.walkthru.help.txt -------------------------------------------------------------------------------- /en-us/Making_Tables_With_Out-HTML.walkthru.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/Making_Tables_With_Out-HTML.walkthru.help.txt -------------------------------------------------------------------------------- /en-us/Managing_Amazon_Web_Services_With_PowerShell_Pipeworks.walkthru.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/Managing_Amazon_Web_Services_With_PowerShell_Pipeworks.walkthru.help.txt -------------------------------------------------------------------------------- /en-us/New-Region_And_JQueryUI.walkthru.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/New-Region_And_JQueryUI.walkthru.help.txt -------------------------------------------------------------------------------- /en-us/New-Webpage_and_JQuery.walkthru.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/New-Webpage_and_JQuery.walkthru.help.txt -------------------------------------------------------------------------------- /en-us/NoHTML_Sites.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/NoHTML_Sites.help.txt -------------------------------------------------------------------------------- /en-us/Pick_up_the_Phone_with_Pipeworks.walkthru.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/Pick_up_the_Phone_with_Pipeworks.walkthru.help.txt -------------------------------------------------------------------------------- /en-us/Pipeworks_Quickstart.walkthru.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/Pipeworks_Quickstart.walkthru.help.txt -------------------------------------------------------------------------------- /en-us/Pipeworks_Writes_CRUD.walkthru.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/Pipeworks_Writes_CRUD.walkthru.help.txt -------------------------------------------------------------------------------- /en-us/Powerful_Powershell_Formatting.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/Powerful_Powershell_Formatting.help.txt -------------------------------------------------------------------------------- /en-us/Publishing_Pipeworks_To_Azure.walkthru.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/Publishing_Pipeworks_To_Azure.walkthru.help.txt -------------------------------------------------------------------------------- /en-us/Scripting_Securely_with_SecureSettings.walkthru.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/Scripting_Securely_with_SecureSettings.walkthru.help.txt -------------------------------------------------------------------------------- /en-us/Scripting_With_Superglue.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/Scripting_With_Superglue.help.txt -------------------------------------------------------------------------------- /en-us/Simpler_SEO.walkthru.help.txt: -------------------------------------------------------------------------------- 1 | # Search Engine Optimization is very simple in PowerShell Pipeworks. 2 | # PowerShell Pipeworks can easily integrate with [Google's Webmaster tools](http://www.google.com/webmasters/tools/). 3 | New-PipeworksManifest -Name ASampleModule -GoogleSiteVerification xjCcGADm2Pnu7fF3WZnPj5UYND9SVqB3qzJuvhe0k1o 4 | 5 | # You can add Analytics trackers just as easily: 6 | New-PipeworksManifest -Name ASampleModule -AnalyticsId UA-XXXXXXX-XX 7 | 8 | # It can also work with [Bing's webmaster tools](http://www.bing.com/toolbox/webmaster) 9 | New-PipeworksManifest -Name ASampleModule -BingValidationKey 7B94933EC8C374B455E8263FCD4FE5EF 10 | 11 | # You can add meta keywords to each page 12 | New-PipeworksManifest -Name ASampleModule -Keyword A, Sample, Module 13 | 14 | # You can let people Like your site by making it a Facebook app: 15 | New-PipeworksManifest -Name ASampleModule -FacebookAppId MyFacebookAppId 16 | 17 | # You can increase sharing by adding Tweet links: 18 | New-PipeworksManifest -Name ASampleModule -Tweet 19 | 20 | # Pipeworks also automatically does a lot of little things to help SEO: 21 | # * [Sitemaps](http://start-automating.com/Sitemap.xml) are automatically generated 22 | # * Pages automatically get description <meta> tags 23 | # * Creating RSS feeds for topics and commands 24 | # * Friendly URLs for aliases, commands, and topics, like [http://start-automating.com/Training/](http://start-automating.com/Training/) 25 | $null 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /en-us/Simplified_SQL.walkthru.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/Simplified_SQL.walkthru.help.txt -------------------------------------------------------------------------------- /en-us/Simplifying_Slideshows.walkthru.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/Simplifying_Slideshows.walkthru.help.txt -------------------------------------------------------------------------------- /en-us/The_Pipeworks_Manifest.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/The_Pipeworks_Manifest.help.txt -------------------------------------------------------------------------------- /en-us/The_Wonders_Of_Wolfram_Alpha.walkthru.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/The_Wonders_Of_Wolfram_Alpha.walkthru.help.txt -------------------------------------------------------------------------------- /en-us/Using_Azure_Table_Storage_in_Pipeworks.walkthru.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/Using_Azure_Table_Storage_in_Pipeworks.walkthru.help.txt -------------------------------------------------------------------------------- /en-us/What_Pipeworks_Does.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/What_Pipeworks_Does.help.txt -------------------------------------------------------------------------------- /en-us/Why_Windows.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/Why_Windows.help.txt -------------------------------------------------------------------------------- /en-us/Working_With_Write-Link.walkthru.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/Working_With_Write-Link.walkthru.help.txt -------------------------------------------------------------------------------- /en-us/about_Pipeworks.help.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/en-us/about_Pipeworks.help.txt -------------------------------------------------------------------------------- /write-crud.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StartAutomating/Pipeworks/23b133b47ae2a33869064a27b98e4f61ae4ff73e/write-crud.ps1 --------------------------------------------------------------------------------