win执行powershell脚本
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
创建Windows Powershell Cmdlets很简单直接,也相当有价值。如果想让你的脚本执行顺利,你需要遵守三个重要步骤
1. 1. 出于安全考虑,操作系统默认不会自动执行Powershell 脚本,因此,我们需要调
整 ExecutionPolicy 来确保Powershell脚本运行。最佳方法是使用下列命令:set-ExecutionPolicy RemoteSigned.
当然修改对应的注册表也可以
1. 2. 确保你的文件后扩展是.ps1
2. 3. 从Powershell命令行调用该文件的办法是:输入完整路径 D:\script\filename
3.如果你已经在D:\scripts, 只要输入.\filename
•提示1:如何快速调用子目录的cmdlet。比如D:\scripts是我的主脚本目录,我把cmdlets保存在里面的子目录,比如D:\scripts\wmi\32proc.ps1。而我现在的
Powershell命令行就在D:\scripts目录下,这样我只要在命令行输入 .\wmi\32proc 即可
•提示2:在调用cmdlet文件时候,没有必要把文件扩展名.ps1也加上去, .\文件名足够了。
•提示3:cmdlets脚本只能在Powershell命令行中使用.\ 才能够调用,这种方法尽管看起来很麻烦,微软是出于安全考虑的才这样做。黑客,钓鱼者可能会诱使人们去执
行恶意的Powershell代码,但是如果直接双击的话并不会执行--- 除非你使用“.\ ”
方法来执行
详细介绍Powershell Cmdlets
下面的介绍和上面差不多,但我们将一步一步来演示
1)Powershell的ExecutionPolicy命令
我偏向这种方法,这样可以通过Powershell的命令来控制脚本的执行策略,在
Powershell命令行中输入下面代码
# PowerShell set-ExecutionPolicy
get-ExecutionPolicy
# Now try:
set-ExecutionPolicy -?
# Here is the crucial command:
set-ExecutionPolicy RemoteSigned
简单来说,你可以直接输入
set-executionpolicy remotedsigned
即可
1b)更改对应Powershell注册表
出于安全因素考虑,在默认设置中,微软阻止Powershell直接运行cmdlets脚本。因此我们需要更改特定的注册表键值来允许cmdlets的执行。如果你直接运行cmdlet脚本,你会看到如下的错误信息:“The execution of scripts is disabled on this system"
为此,我们需要更改注册表REG_SZ_ExecutionPolicy的键值,将其更改为RemoteSigned。还有另外两种选择Unrestricted 和Allsigned. 但是,RemoteSigned是最推荐的,因为它允许你运行本地的脚本,而会阻止其他人从另外机器上(比如互联网)攻击你。
请浏览到下面的键值去更改
HKLM\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell
把键值更改为
REG_SZ ExecutionPolicy RemoteSigned
2a)文件名和.ps1扩展名
当你使用记事本来创建Powershell Cmdlet时候,文件名必须是以.ps1作为扩展名的,如runningprocess.ps1. 有一种办法把你的Powershell命令保存到记事本是,通过菜单,选择另存,选择所有文件,runningprocess.ps1.
为了确认,你可以把“”加入进去,如“RunningProcess.ps1”,请确认文件不是RunningProcess.txt或RunningProcess.ps1.txt
在你filename.ps1的内容就是你在Powershell命令行里面输入的命令。你可以尝试输入get-process在你的测试ps1文件中,然后再执行(可能看起来太简单,但是我的方法就是保持事件简单而成功)
下面是一些高级演示,只是让你感觉到cmdlet的强大
# RunningServices.ps1 PowerShell Cmdlet
# This script generates a report about Running Services
# Guy Thomas September 2007
# Version 1.5
"" # Insert a blank line
"Report generated at " + (get-date)
"" # Insert blank line
"Services that are running"
get-service | where-object { $_.status -eq "Running"}
•提示1:实例中最关键的命令就是get-service,
•提示2:让我们看看Where 这个参数,{$_. 是一个需要介绍的特殊变量。在当前的管道中,美元符号$表明我们正在使用变量,下划线符号表明变量值在后面。进程对象有很多属性,我们这边使用的是.status, -eq 意思是左边的值等于右边的值。这个句子也就是,我们在找这样的值,值的条件是status是Running的。
•除-eq外,我们还有比较符, -match, -contain (等于以及包含)
•
•提示2b:调用文件
•设想:你把cmdlets脚本文件保存在一个目录里,目录是D:\scripts,在这个例子里,文件是为runningservices.ps1
•当通过调用文件名来执行cmdlet,你并不需要加入.ps1扩展名。但是你还是需要注意路径,你需要在命令行里面输入完整路径,如D:\scripts\runningservices. 这样可以执行。
在成功的基础上,我们再进一步。通过下面方法在Powershell里面定位到D:\Scripts目
录,
set-location d:\scripts
现在你就可以简单输入命令 .\runningservices, 而不用输入
d:\scripts\runningservices