Windows Powershell 执行文件和脚本
象运行可执行文件一样,powershell运行文件和脚本,也必须使用绝对路径或者相对路径,或者要运行的文件必须定义在可受信任的环境变量中。
关于脚本
脚本和批处理都属于伪可执行文件,它们只是包含了若干命令行解释器能够解释和执行的命令行代码。
执行批处理文件
批处理是扩展名为”.bat”的文本文件,它可以包含任何cmd控制台能够处理的命令。当批处理文件被打开,cmd控制台会逐行执行每条命令。那powershell能够直接执行批处理吗?
将下列命令保存为ping.bat
@echo off echo batch file test pause dir %windir%/system
然后执行ping
屏幕会打印ping命令帮助,说明调用的ping cmd 而不是ping.bat。
改为:
ps c:\ps> ./ping batch file test press any key to continue . . . volume in drive c has no label. volume serial number is 4e9b-d846 directory of c:windowssystem 2009/06/11 05:21 69,584 avicap.dll 2009/06/11 05:21 109,456 avifile.dll 2009/07/14 05:41 32,816 commdlg.dll 2009/07/14 05:41 2,000 keyboard.drv 2009/06/11 05:42 9,936 lzexpand.dll 2009/06/11 05:21 73,376 mciavi.drv 2009/06/11 05:21 25,264 mciseq.drv 2009/06/11 05:21 28,160 mciwave.drv 2009/07/14 05:41 68,992 mmsystem.dll 2009/07/14 05:41 1,152 mmtask.tsk 2009/07/14 05:41 2,032 mouse.drv 2009/06/11 05:21 126,912 msvideo.dll 2009/06/11 05:42 82,944 olecli.dll 2009/07/14 05:41 24,064 olesvr.dll 2009/07/14 05:41 5,120 shell.dll 2009/07/14 05:41 1,744 sound.drv 2009/06/11 05:25 5,532 stdole.tlb 2009/07/14 05:41 3,360 system.drv 2009/07/14 05:41 4,048 timer.drv 2009/06/11 05:42 9,008 ver.dll 2009/07/14 05:41 2,176 vga.drv 2009/07/14 05:41 12,704 wfwnet.drv 22 file(s) 700,380 bytes 2 dir(s) 75,927,420,928 bytes free
这时运行的是批处理。
通过cmd进入cmd控制台输入ping发现执行的不是ping命令,而是直接运行ping.bat ,也就是说可以通过.bat 覆盖cmd命令。这种机制很危险,如果有人侵入电脑,并将系统内部命令篡改成自己批处理,那就太悲剧了。 这种命令与脚本的混淆不会发生在powershell中,因为powershell有更安全的机制。
执行vb脚本文件
将下列命令保存为test.vbs
set wmi = getobject("winmgmts:") set collection = wmi.execquery("select * from win32_process") for each process in collection wscript.echo process.getobjecttext_ next
执行 .\test.vbs 会遍历当前win32进程,并把每个进程的详细信息通过窗口显示出来。
怎样让vb脚本的通过控制台输出呢?
wscript //h:cscript
怎样还原vb脚本通过窗口输出呢?
wscript //h:wscript
在powershell中执行vb脚本
ps c:\ps> cscript.exe .test.vbs microsoft (r) windows script host version 5.8 copyright (c) microsoft corporation. all rights reserved. instance of win32_process { caption = "system idle process"; creationclassname = "win32_process"; cscreationclassname = "win32_computersystem"; csname = "test-me-01"; description = "system idle process"; handle = "0"; handlecount = 0; kernelmodetime = "484113379271"; name = "system idle process"; oscreationclassname = "win32_operatingsystem"; osname = "microsoft windows 7 enterprise |c:windows|deviceharddisk0partition2"; otheroperationcount = "0"; othertransfercount = "0"; pagefaults = 0; pagefileusage = 0; parentprocessid = 0; peakpagefileusage = 0; peakvirtualsize = "0"; peakworkingsetsize = 0; priority = 0; privatepagecount = "0"; processid = 0; quotanonpagedpoolusage = 0; quotapagedpoolusage = 0; quotapeaknonpagedpoolusage = 0; quotapeakpagedpoolusage = 0; readoperationcount = "0"; readtransfercount = "0"; sessionid = 0; threadcount = 2; usermodetime = "0"; virtualsize = "0"; windowsversion = "6.1.7601"; workingsetsize = "24576"; writeoperationcount = "0"; writetransfercount = "0"; };
执行powershell脚本
powershell拥有自己的脚本,扩展名为“.ps1”
ps c:\ps> echo "dir;get-psprovider;help dir" >test.ps1 ps c:\ps> get-content ./test.ps1 dir;get-psprovider;help dir ps c:\ps> ./test.ps1初次执行脚本时,可能会碰到一个异常: file ” c:\ps\test.ps1″ cannot be loaded because the execution of scripts is disabled on this system. please see “get-help about_signing” for more details. at line:1 char:10 + .test.ps1 <<<<
这是powershell的默认安全设置禁用了执行脚本,要启用这个功能需要拥有管理员的权限。
开启:set-executionpolicy remotesigned
关闭:set-executionpolicy restricted
powershell调用入口的优先级
别名:控制台首先会寻找输入是否为一个别名,如果是,执行别名所指的命令。因此我们可以通过别名覆盖任意powershell命令,因为别名的优先级最高。
函数:如果没有找到别名,会继续寻找函数,函数类似别名,只不过它包含了更多的powershell命令。因此可以自定义函数扩充cmdlet 把常用的参数给固化进去。
命令:如果没有找到函数,控制台会继续寻找命令,即cmdlet,powershell的内部命令。
脚本:没有找到命令,继续寻找扩展名为“.ps1”的powershell脚本。
文件:没有找到脚本,会继续寻找文件,如果没有可用的文件,控制台会抛出异常。
the term ‘now' is not recognized as the name of a cmdlet, function, script file, or operable program. chec g of the name, or if a path was included, verify that the path is correct and try again. at line:1 char:4 + now <<<< + categoryinfo : objectnotfound: (now:string) [], commandnotfoundexception + fullyqualifiederrorid : commandnotfoundexception
推荐阅读
-
配置Samba实现Linux和Windows系统之间的文件互访
-
Shell脚本中使用for循环和cat命令实现按顺序合并文件
-
Bash脚本编程之脚本基础和bash配置文件
-
登录Windows界面前执行自定义脚本
-
Windows本地环境和Linux腾讯云服务器之间传输文件的方法
-
PowerShell中使用Get-ChildItem命令读取目录、文件列表使用例子和小技巧
-
ssh远程执行命令方法和Shell脚本实例
-
windows下上传shell脚本不能运行—将dos模式修改为unix 文件格式
-
在windows和linux之间用SecureCRT来上传和下载文件
-
Windows10文件目录下添加 Shift+右键打开管理员Powershell窗口