标题: [问题求助] 初涉Powershell 不懂,求注释 [打印本页]
作者: terse 时间: 2013-11-1 16:14 标题: 初涉Powershell 不懂,求注释
本帖最后由 terse 于 2013-11-1 16:15 编辑
下载了一段Powershell代码 对其中功能的实现不了解 谁能注释下吗 感谢- function Get-WebSite {
- <#
- .SYNOPSIS
- Retrieves information about a website.
- .DESCRIPTION
- Retrieves information about a website.
- .PARAMETER Url
- URL of the website to test access to.
- .PARAMETER UseDefaultCredentials
- Use the currently authenticated user's credentials
- .PARAMETER Proxy
- Used to connect via a proxy
- .PARAMETER TimeOut
- Timeout to connect to site, in milliseconds
- .PARAMETER Credential
- Provide alternate credentials
- .NOTES
- Name: Get-WebSite
- Author: Boe Prox
- DateCreated: 08Feb2011
- .EXAMPLE
- Get-WebSite -url "http://www.bing.com"
-
- Description
- ------------
- Returns information about Bing.Com to include StatusCode and type of web server being used to host the site.
-
- #>
- [cmdletbinding(
- DefaultParameterSetName = 'url',
- ConfirmImpact = 'low'
- )]
- Param(
- [Parameter(
- Mandatory = $True,
- Position = 0,
- ParameterSetName = '',
- ValueFromPipeline = $True)]
- [string][ValidatePattern("^(http|https)\://*")]$Url,
- [Parameter(
- Position = 1,
- Mandatory = $False,
- ParameterSetName = 'defaultcred')]
- [switch]$UseDefaultCredentials,
- [Parameter(
- Mandatory = $False,
- ParameterSetName = '')]
- [string]$Proxy,
- [Parameter(
- Mandatory = $False,
- ParameterSetName = '')]
- [Int]$Timeout,
- [Parameter(
- Mandatory = $False,
- ParameterSetName = 'altcred')]
- [switch]$Credential
-
- )
- Begin {
- $psBoundParameters.GetEnumerator() | % {
- Write-Verbose "Parameter: $_"
- }
-
- #Create the initial WebRequest object using the given url
- Write-Verbose "Creating the web request object"
- $webRequest = [net.WebRequest]::Create($url)
-
- #Use Proxy address if specified
- If ($PSBoundParameters.ContainsKey('Proxy')) {
- #Create Proxy Address for Web Request
- Write-Verbose "Creating proxy address and adding into Web Request"
- $webRequest.Proxy = New-Object -TypeName Net.WebProxy($proxy,$True)
- }
-
- #Set timeout
- If ($PSBoundParameters.ContainsKey('TimeOut')) {
- #Setting the timeout on web request
- Write-Verbose "Setting the timeout on web request"
- $webRequest.Timeout = $timeout
- }
-
- #Determine if using Default Credentials
- If ($PSBoundParameters.ContainsKey('UseDefaultCredentials')) {
- #Set to True, otherwise remains False
- Write-Verbose "Using Default Credentials"
- $webrequest.UseDefaultCredentials = $True
- }
- #Determine if using Alternate Credentials
- If ($PSBoundParameters.ContainsKey('Credentials')) {
- #Prompt for alternate credentals
- Write-Verbose "Prompt for alternate credentials"
- $wc.Credential = (Get-Credential).GetNetworkCredential()
- }
-
- #Set TimeStamp prior to attempting connection
- $then = get-date
- }
- Process {
- Try {
- #Make connection to gather response from site
- $response = $webRequest.GetResponse()
- #If successful, get the date for comparison
- $now = get-date
-
- #Generate report
- Write-Verbose "Generating report from website connection and response"
- $report = @{
- URL = $url
- StatusCode = $response.Statuscode -as [int]
- StatusDescription = $response.StatusDescription
- ResponseTime = "$(($now - $then).totalseconds)"
- WebServer = $response.Server
- Size = $response.contentlength
- }
- }
- Catch {
- #Get timestamp of failed attempt
- $now = get-date
- #Put the current error into a variable for later use
- $errorstring = "$($error[0])"
-
- #Generate report
- $report = @{
- URL = $url
- StatusCode = ([regex]::Match($errorstring,"\b\d{3}\b")).value
- StatusDescription = (($errorstring.split('\)')[2]).split('.\')[0]).Trim()
- ResponseTime = "$(($now - $then).totalseconds)"
- WebServer = $response.Server
- Size = $response.contentlength
- }
- }
- }
- End {
- #Display Report
- New-Object PSObject -property $report
- }
- }
-
-
-
- Get-WebSite -url "http://www.bing.com"
复制代码
- function Get-WebPage {
- <#
- .SYNOPSIS
- Downloads web page from site.
- .DESCRIPTION
- Downloads web page from site and displays source code or displays total bytes of webpage downloaded
- .PARAMETER Url
- URL of the website to test access to.
- .PARAMETER UseDefaultCredentials
- Use the currently authenticated user's credentials
- .PARAMETER Proxy
- Used to connect via a proxy
- .PARAMETER Credential
- Provide alternate credentials
- .PARAMETER ShowSize
- Displays the size of the downloaded page in bytes
- .NOTES
- Name: Get-WebPage
- Author: Boe Prox
- DateCreated: 08Feb2011
- .EXAMPLE
- Get-WebPage -url "http://www.bing.com"
-
- Description
- ------------
- Returns information about Bing.Com to include StatusCode and type of web server being used to host the site.
-
- #>
- [cmdletbinding(
- DefaultParameterSetName = 'url',
- ConfirmImpact = 'low'
- )]
- Param(
- [Parameter(
- Mandatory = $True,
- Position = 0,
- ParameterSetName = '',
- ValueFromPipeline = $True)]
- [string][ValidatePattern("^(http|https)\://*")]$Url,
- [Parameter(
- Position = 1,
- Mandatory = $False,
- ParameterSetName = 'defaultcred')]
- [switch]$UseDefaultCredentials,
- [Parameter(
- Mandatory = $False,
- ParameterSetName = '')]
- [string]$Proxy,
- [Parameter(
- Mandatory = $False,
- ParameterSetName = 'altcred')]
- [switch]$Credential,
- [Parameter(
- Mandatory = $False,
- ParameterSetName = '')]
- [switch]$ShowSize
-
- )
- Begin {
- $psBoundParameters.GetEnumerator() | % {
- Write-Verbose "Parameter: $_"
- }
-
- #Create the initial WebClient object
- Write-Verbose "Creating web client object"
- $wc = New-Object Net.WebClient
-
- $wc.Encoding = [System.Text.Encoding]::UTF8
-
- #Use Proxy address if specified
- If ($PSBoundParameters.ContainsKey('Proxy')) {
- #Create Proxy Address for Web Request
- Write-Verbose "Creating proxy address and adding into Web Request"
- $wc.Proxy = New-Object -TypeName Net.WebProxy($proxy,$True)
- }
-
- #Determine if using Default Credentials
- If ($PSBoundParameters.ContainsKey('UseDefaultCredentials')) {
- #Set to True, otherwise remains False
- Write-Verbose "Using Default Credentials"
- $wc.UseDefaultCredentials = $True
- }
- #Determine if using Alternate Credentials
- If ($PSBoundParameters.ContainsKey('Credentials')) {
- #Prompt for alternate credentals
- Write-Verbose "Prompt for alternate credentials"
- $wc.Credential = (Get-Credential).GetNetworkCredential()
- }
-
- }
- Process {
- Try {
- If ($ShowSize) {
- #Get the size of the webpage
- Write-Verbose "Downloading web page and determining size"
- "{0:N0}" -f ($wr.DownloadString($url) | Out-String).length -as [INT]
- }
- Else {
- #Get the contents of the webpage
- Write-Verbose "Downloading web page and displaying source code"
- $wc.DownloadString($url)
- }
-
- }
- Catch {
- Write-Warning "$($Error[0])"
- }
- }
- }
-
-
- Get-WebPage -url "http://www.bing.com"
复制代码
只用一些简单的- $url = 'http://www.bing.com'
- $wc = new-object system.net.webclient
- $wc.downloadstring($url)
复制代码
作者: foxJL 时间: 2013-11-1 17:04
同求,我想知道每行前的$符号有什么用.小白,别笑话我
作者: DAIC 时间: 2013-11-1 17:55
回复 2# foxJL
定义变量
作者: foxJL 时间: 2013-11-1 18:25
回复 3# DAIC
我还以为像bat里@的作用。让你贱笑了,呵呵
作者: PowerShell 时间: 2013-11-2 10:59
本帖最后由 PowerShell 于 2013-11-2 11:24 编辑
$ 打头的都是变量,这个跟php语言类似。这里面我说说powershell语法怎么个好法。
$ 是统一,标准的,也是唯一的。
比如$aaa ,这个变量不管定义,还是引用,都要用$ ,比python更容易看懂。比python的【无变量打头符号】定义变量好。powershell这种做法,更容易区分内置关键字,和变量!
-------我个人认为这比bat的%aaa% !bbb! 好,有时候我觉得bat的变量真tm乱。
而powershell变量的定义要求,也要比python好:
1比如可以定义任意unicode变量,如 $三顾茅庐 = 3 。总之 .net的unicode支持比python好。
2可以定义数字变量,如 $123 = "a" ; echo ($123 + "b") 输出结果为ab
3powershell定义的变量可以数字打头,这python不行。
4重要!你一定要记住:每个变量都是对象,这和vbs,python,相同。
而每种对象,都自带有属性,方法。这就是面向对象开发之妙也~~~
比如$aaa = "abcd"
那么$aaa.toupper()
将返回ABCD
标准,直观,简单,-------我认为【从变量定义的角度】,学powershell比bat更容易菜鸟理解,学习的也快。
-------------------------------------------------------
另外楼主贴的代码是非常规范的代码,规范到国际版了。还有注释,甚至说所有powershell脚本都应该这么写。
1 这是一个函数定义。
2 2-----28行。前面的大段注释都是 默认的,每个参数都是干嘛的,谁写的脚本,如何用等。
<# powershell大段注释语法 #>
# powershell单行注释语法
3 29行-----58行是参数约束
4 59行----137行为函数主体。
4.1 函数的正宗写法是由3部分组成: (详见镇派葵花宝典,即手册中的说明)
Begin { 一般这里初始化变量 }
Process { 一般具体计算 }
end { 一般这里处理输出,或者扫尾工作 }
4.2 函数可以简化,不要上述3个部分。只要一个大括号包起来。如下例:
aaa,aaa2函数,作用完全相同。
----------------------- function aaa {
- begin {}
- process {echo "你好"}
- end {}
- }
复制代码
---------------- function aaa2 {
- echo "你好"
-
- }
复制代码
---------------
作者: terse 时间: 2013-11-2 18:31
本帖最后由 terse 于 2013-11-2 18:33 编辑
回复 5# PowerShell
无论怎样先谢你的解答
唉~只怪老夫乃天生愚笨,虽得版主指点,也不解心中迷困,
其实代码本身并不复杂 主要powershell很多的类方法都不熟悉啊
这里参数怎么传进去 传进去处理流程怎样
发现下面参数里的 -URL 有和没有一样 是否里面定义HTTP和HTTPS开头就定义给 $URL 呢?
如果要传多个参数怎么调用呢 最多支持几个参数进去
如每次调用 要变换PROXY的话怎么办 等等
最好有范例出来就好了 或许你们都忙 那就忽略吧
最后还是谢了哦
作者: PowerShell 时间: 2013-11-2 21:13
1 powershell很多的类方法都不熟悉啊---------我个人不认为初学者应该学。net类,即使学,也学string类,file类,几个浅显的类足矣,等到学powershell一年以上,再学。net类不迟。初学者应该把精力着重于学习语法,和最新的命令,如powershell4.0带的命令。和第三方库,脚本上。这些命令和库能满足绝大多数初学者的需求。如果有此初学者学过vbs,那么学。net类对他来说就简单多了。可以认为。net类是100多个vbs类的扩展。它们用起来类似。
2 参数怎么传进去。-----貌似只有bat bash 无函数,也难传值,其他大多语言都是 [函数 参数1 参数2 ]这样的传。
函数用法 和powershell的内部命令差不多。
3 最多支持几个参数进去 ---这个我还真不知道.或许是255 ? 我只知道传的数据多了,数据类型又是相同的,可以用数组的方式传,这样就只有1个参数,参数数量只限于数组(列表)大小.不过一般函数都不会超过20个不同的参数.
4 发现下面参数里的 -URL 有和没有一样 ---对.
5 如果要传多个参数怎么调用呢 ? 传进去处理流程怎样? ---暂且不答
6 如每次调用 要变换PROXY的话怎么办 ---编写函数时加个proxy参数即可.
2 3 4 5 6 我都没详细回答,因为你是牛人,不是菜鸟啊,你需要置顶帖中的葵花宝典,即官方手册了,
手册分两部分,第一部分为about xxx 讲的是语法.你看语法中about_Functions ,about_Functions_Advanced
等即可.第二部分为库,讲的是每个命令用法.
最后我再凿吧两句:
powershell语法标准学的快,命令=库 强大功能强。故,学一年powershell练出的技能顶学bat,bash五年.
bat bash 都是破铜烂铁,awk sed 都是虾兵蟹将.powershell语言眼中只有python堪称敌手.
作者: terse 时间: 2013-11-2 22:34
回复 7# PowerShell
再次谢你耐心的解答
先看会 看懂和看不懂 都要看的 必须的 谢谢
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |