-
格式化操作符 –F 在PowerShell文本操作符中非常重要,经常被用来增强数字类型和日期类型的可读性: "{0} diskettes per CD" -f (720mb/1.44mb) 500 diskettes per CD查看全部
-
用户交互 如果要提示用户输入可以使用read-host PS E:> $name=Read-Host "请输入您的用户名" 请输入您的用户名: Mosser Lee PS E:> "您输入的用户名为:$name" 您输入的用户名为:Mosser Lee 只是有一点Read-Host存储的字符串使用的单引号闭合,也就是说不会自动解析变量,不过可以通过ExpandString方法解析,例如: PS E:> $inputPath=Read-Host "请输入文件路径" 请输入文件路径: $env:windir PS E:> $inputPath $env:windir PS E:> $ExecutionContext.InvokeCommand.ExpandString($inputPath) C:windows 但是如果想通过Read-Host接受敏感数据,比如密码,可以使用-asSecureString选项,不过这样读取到的数据为SecureString,及为加过密后的数据,当然你可以将密码转换成普通文本. PS E:> $pwd=Read-Host -AsSecureString "请输入密码" 请输入密码: ****** PS E:> $pwd System.Security.SecureString PS E:> [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($pwd)) abc123 询问用户名和密码 如果你想授权一个用户需要提供用户凭据,可以使用Get-Credential命令,该命令会弹出一个安全对话框,一旦用户输入完毕,就会返回一个Credential对象包含用户名和密码 PS E:> $cre=Get-Credential MossserLee PS E:> $cre UserName Password -------- -------- MossserLee System.Security.SecureString查看全部
-
Here strings 定义多行文本 @“字符串”@格式定义多行文本,尤其是较长的文本,再好不过了 1 2 3 4 5 6 @" 这首诗用来评价陶渊明的诗歌再好不过了 一语天然万古新,豪华落尽见真淳。 南窗白日羲皇上,未害渊明是晋人。 "@ 这里要注意开始和结束的标记必须另起一行。查看全部
-
其它的转义字符如下表 Powershell转义字符表 转义字符 描述 `n 换行符 `r 回车符 `t 制表符 `a 响铃符 `b 退格符 `’ 单引号 `” 双引号 `0 Null “ 反引号本身查看全部
-
Powershell转义字符 在其它编程语言中喜欢将反斜杠作为转义字符,但是在Powershell中扮演转义字符角色的不是反斜杠,而是反引号“`”字符串中的反引号,会对紧跟随其后的字符进行特殊处理。例如下面的,在一个字符串中输出双引号,和换行符。 1 2 3 4 5 6 #使用单引号闭合字符串输出双引号 'The site of my blog is"www.mossfly.com"' #使用转义字符输出双引号 “My blog site is`"www.mossfly.com`"" #在字符串中输出换行符 “The site of my blog is `"www.mossfly.com`",`n飞苔博客" 输出: The site of my blog is”www.mossfly.com” My blog site is”www.mossfly.com” The site of my blog is “www.mossfly.com”, 飞苔博客查看全部
-
文本中的特殊字符 如果文本放置在一个闭合的双引号中,Powershell解释器回去寻找特殊字符.在这方便主要有两种特殊字符,一个是变量的前缀“$”,一个是反引号“·”位于数字键1左边。 处理变量 将变量放在字符串中,输出时变量会被替换成变量本身的值或者内容。如果将表达式放置在字符串中,并且使用的格式如“$(expression)”,表达式也会被执行,并被替换成表达式执行的输出。 1 2 3 4 5 6 "系统目录位于:$env:windir" "默认安装程序目录位于:$env:ProgramFiles" "机器名为:$env:computername" "当前日期:$(get-date)" "1GB=$(1gb/1kb)KB"查看全部
-
使用引号可以定义字符串,如果想让自己定义的字符串原样输出,可以使用单引号。 1 2 $text='$fei $(tai) $env:windir 飞苔博客 (20+2012)' $text 输出: $fei $(tai) $env:windir 飞苔博客 (20+2012) 如果想让自己的定义的字符中的变量被内容替换,表达式被执行可以使用双引号. 1 2 3 $site="飞苔博客 Powershell博客" $text="$site $(get-date) $env:windir" $text 输出: 飞苔博客 Powershell博客 08/25/2012 18:49:41 C:windows查看全部
-
执行命令行 输入的命令行可以通过InvokeScript()脚本执行,也可以使用&执行,也可以使用Invoke-Expression命令执行 1 2 3 4 $cmd='3*3*3.14' & { 3*3*3.14} $executioncontext.InvokeCommand.InvokeScript($cmd) Invoke-Expression $cmd 输出: 28.26 28.26 28.26查看全部
-
创建脚本块 如果将Powershell代码放置在花括号中,这样既可以使用调用操作符&执行脚本,也可以将脚本块赋值给一个函数,因为之前的文章中说过,函数是一个命令的脚本块. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 # 创建新的脚本块 $block = { $write=Get-Process WindowsLiveWriter "$($write.Name) 占用内存: $($write.WorkingSet/1mb) MB" } $block.GetType().Name & $block # 使用NewScriptBlock方法创建脚本块: $blockStr='$write=Get-Process WindowsLiveWriter "$($write.Name) 占用内存: $($write.WorkingSet/1mb) MB"' $block = $executioncontext.InvokeCommand.NewScriptBlock($blockStr) $block.GetType().Name & $block 输出: ScriptBlock WindowsLiveWriter 占用内存: 150.734375 MB ScriptBlock WindowsLiveWriter 占用内存: 150.734375 MB查看全部
-
InvokeCommand 到目前为止,我们在Powershell控制台中遇到三个比较特殊的字符,字符串标识双引号,调用操作符 &,和脚本块标识花括号。 特殊字符 定义 内部方法 “ 处理字符串中的变量 ExpandString() & 执行命令集 InvokeScript() {} 创建一个新的代码块 NewScriptBlock() 处理变量 每当你在Powershell的字符串中放置一个变量,Powershell解释器会自动处理该变量,并将变量替换成变量本身的值或者内容。 1 2 3 4 $site = '飞苔博客' # 双引号中的变量会被自动解析成变量的值: $text = "我的个人网站 $site" $text 输出: 我的个人网站 飞苔博客 既然双引号的机制是ExpandString()方法,那么也可以自己调用该方法 1 2 3 4 5 6 $site = '飞苔博客' # 双引号中的变量会被自动解析成变量的值: $text = '我的个人网站 $site' $text #通过ExpandString()自动处理字符串中的变量 $executioncontext.InvokeCommand.ExpandString($text) 输出: 我的个人网站 $site 我的个人网站 飞苔博客查看全部
-
Powershell 提供了一个非常特别的自动化变量,$ExecutionContext。这个变量可能会很少碰到,但是理解它的机制,有助于我们理解Powershell执行命令和脚本的内部机制。这个对象主要包含两个属性:InvokeCommand 和 SessionState. PS E:> $ExecutionContext Host : System.Management.Automation.Internal.Host.InternalHost Events : System.Management.Automation.PSLocalEventManager InvokeProvider : System.Management.Automation.ProviderIntrinsics SessionState : System.Management.Automation.SessionState InvokeCommand : System.Management.Automation.CommandInvocationIntrinsics查看全部
-
Begin, Process, End 管道语句块 之前讲过定义函数也可以按照Begin, Process, End的结构,这样尤其可以实时处理管道数据。那能不能也直接通过语句块定义呢? get-process | select -last 5 | & { begin { "开始准备环境" } process { $_.Name } end { "开始清理环境" } } #输出结果为: 开始准备环境 wlcommsvc WLIDSVC WLIDSVCM WmiPrvSE XDict 开始清理环境 验证变量 函数中的所有变量都是内置的,属于函数定义域。除非你指定给一个全局变量赋值。首先通过函数实现: function Test { $value1 = 10 $global:value2 = 20 } Test $value1 $value2 20 那语句块也支持吗?例如: & { $value1 = 10; $global:value2 = 20 } $value1 $value2 20 通过语句块可以实现函数的3个特性,再一次印证了函数确实是命名的语句块。查看全部
-
构建语句块 既然函数只是被命令的语句块,那是不是也可以通过语句块就能实现函数的特性呢?接下来就验证一下吧。 传递参数给语句块 在函数中可以传递参数: Function SayHello([string]$people="everyone") { write-host "Hello, $people ” } 能否在语句块中也传递参数? & { param($people="everyone") write-host "Hello, $people ” } "Mosser" Hello, Mosser 定义和传递参数一次性完成,有点匿名函数的味道。查看全部
-
通过invoke-expression可以执行一段字符串,要比&强。 Invoke-Expression,这条命令的逻辑就是将一条字符串传递给调用操作符。例如: PS E:> Invoke-Expression 'Get-Process | Where-Object { $_.Name -like "e*"}' Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 332 29 12280 24264 154 1.40 3236 egui 386 32 78624 85508 183 1884 ekrn 284 22 8980 17048 99 1920 EvtEng 1000 89 55520 83280 355 23.24 2848 explorer 这里有一点需要注意,在传递给invoke-expression的字符串使用了单引号,单引号可以防止变量被替换。如果上面的命令使用了双引号,会先去解释$_.name,但是当前作用域中,$_.Name 为null,所以结果不是期望的。查看全部
-
将命令行作为整体执行 可能你已经意识到,在Powershell中,调用操作符不但可以执行一条单独的命令,还可以执行”命令行”.最方便的方式就是讲你的命令行放在一个语句块中,作为整体。在之前的文章中说过,调用操作符只能执行一条命令,但是借助语句块的这把利器,可以让调用操作符执行,多条Powershell命令,例如: PS E:> & {$files=ls;Write-Host "文件数:" $files.Count } 文件数: 29 执行表达式 另外还有一条Powershell命令集,Invoke-Expression,这条命令的逻辑就是将一条字符串传递给调用操作符。例如: PS E:> Invoke-Expression 'Get-Process | Where-Object { $_.Name -like "e*"}' Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 332 29 12280 24264 154 1.40 3236 egui 386 32 78624 85508 183 1884 ekrn 284 22 8980 17048 99 1920 EvtEng 1000 89 55520 83280 355 23.24 2848 explorer 这里有一点需要注意,在传递给invoke-expression的字符串使用了单引号,单引号可以防止变量被替换。如果上面的命令使用了双引号,会先去解释$_.name,但是当前作用域中,$_.Name 为null,所以结果不是期望的。查看全部
举报
0/150
提交
取消