Windows PowerShell 命令与脚本实践指南

table {
border-collapse: collapse;
width: 100%;
margin-bottom: 1rem;
}
th, td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
}
th {
background-color: #f2f2f2;
}
tr:nth-child(even) {
background-color: #f9f9f9;
}
pre {
background-color: #f8f8f8;
padding: 15px;
border-radius: 4px;
overflow-x: auto;
}

1、通过“开始|运行|Windows PowerShell”启动Windows PowerShell,PowerShell提示符默认是否会在“我的文档和设置”的根目录下打开?

该描述介绍了启动 Windows PowerShell 的一种方式,但 PowerShell 提示符默认不会在“我的文档和设置”的根目录下打开,通常默认是在用户的主目录下打开。

2、使用Get – ChildItem cmdlet的别名gci,获取根目录中包含的文件和文件夹列表。

在Windows PowerShell中可直接输入命令:gci

3、为了更快速地识别大文件,将输出通过管道传递给 Where-Object cmdlet,并指定 gt 参数的值为 1000 来评估长度属性。

gci | where-object {$_.length -gt 1000}

4、要清除 Windows PowerShell 窗口中的杂乱数据,请使用 cls 命令来清空屏幕。

这句话是正确的。在 Windows PowerShell 中,

cls


Clear-Host

命令的别名,使用

cls

命令可以清除当前 PowerShell 窗口中的显示内容。

5、使用Get – Alias cmdlet来解析cls别名所指向的cmdlet。

可以使用以下命令:gal cls

6、使用 Get – Alias cmdlet 来解析 mred 别名所指向的 cmdlet。

gal mred

7、使用Get – Member cmdlet从Get – ChildItem cmdlet中检索属性和方法列表。

在Windows PowerShell提示符下,输入

Get-ChildItem

cmdlet,后跟文件夹的路径,并将其通过管道传递给

Get-Member

cmdlet。

示例:


Get-ChildItem C: | Get-Member

8、检查输出结果,找出一个可以与 Where – Object cmdlet 配合使用的属性,以查找文件的修改日期。

LastWriteTime

9、使用向上箭头调出上一条命令。现在将Get – ChildItem cmdlet指向你硬盘上的特定文件夹,比如可以使用你机器上存在的任意文件夹。

在 Windows PowerShell 提示符下,使用向上箭头调出上一条命令,然后将命令中的目录指定为你想要的文件夹,例如:


get-childitem C:fso

10、再次使用向上箭头键调出上一条命令。给 Get – ChildItem cmdlet 添加 recurse 参数。如果之前的文件夹不是嵌套的,那么你可以更换到 Windows 文件夹(它是深度嵌套的)并执行添加 recurse 参数后的命令。

这是一个操作步骤说明,若要给出对应命令示例:

之前的命令为:

powershell
get-childitem "C:fso" | where-object { $_.LastWriteTime -gt "12/25/2006" }

添加

recurse

参数后为:

powershell
get-childitem -recurse "C:fso" | where-object { $_.LastWriteTime -gt "12/25/2006" }

若更换到 Windows 文件夹,命令可以是:

powershell
get-childitem -recurse "C:Windows" | where-object { $_.LastWriteTime -gt "12/25/2006" }

11、使用New – Object cmdlet创建wshNetwork对象的实例。使用comobject参数,并为其指定wshNetwork对象的程序ID,即“wscript.network”。将结果存储在名为$wshnetwork的变量中。


$wshnetwork = New-Object -ComObject "WScript.Network"

12、使用 wshNetwork 对象的 EnumPrinterConnections 方法打印出本地计算机上定义的打印机连接列表。为此,请使用 $wshnetwork 变量中包含的 wshNetwork 对象。

要实现此操作,对应的命令为

$wshnetwork.EnumPrinterConnections()

13、使用wshNetwork对象的EnumNetworkDrives方法打印出本地计算机上定义的网络连接列表。为此,请使用包含在$wshnetwork变量中的wshNetwork对象。

$wshnetwork.EnumNetworkDrives()

14、使用向上箭头两次,调出 $wshnetwork.EnumPrinterConnections() 命令。使用 $colPrinters 变量来保存该命令返回的打印机集合。


$colPrinters = $wshnetwork.EnumPrinterConnections()

15、使用Set – Location cmdlet切换到证书驱动器。

Set-Location cert: 或 Sl cert:

16、使用Get – ChildItem cmdlet列出机器上的所有证书。


Get-ChildItem -Path Cert: -Recurse

注:

GCI


Get-ChildItem

的别名,但仅写

GCI

无法准确列出机器上所有证书,需要指定路径并递归查询。这里使用

Cert:

作为证书存储路径并递归列出所有证书。

17、要确定计算机上是否安装了其他证书,请再次使用 Get-ChildItem cmdlet,但这次要指定 recurse 参数。使用向上箭头修改上一个命令。

使用向上箭头调出上一个

Get-ChildItem

命令,然后添加

-recurse

参数,命令为:


Get-ChildItem -recurse

18、使用New-PSDrive cmdlet创建一个到别名提供程序的驱动器映射。新的PSDrive名称为al,PSProvider为alias,根目录为点号(.)。

new-PSDrive -name al -PSProvider alias -Root .

19、将工作位置更改为你命名为 al 的新 PSDrive。为此,请使用 Set-Location cmdlet 的别名 sl。

SL al:

20、使用Get – ChildItem cmdlet的别名gci,并通过使用sort别名将结果对象导入Sort – Object cmdlet。指定name作为排序属性。

gci | sort -Property name

21、按照以下步骤创建10个文件夹:1. 打开记事本或你喜欢的Windows PowerShell脚本编辑器;2. 创建一个名为$intFolders的变量并赋值为10;3. 创建一个名为$intPad的变量,暂不赋值;4. 创建一个名为$i的变量并赋值为1;5. 使用New – Variable cmdlet创建一个名为strPrefix的变量,将其值设为”testFolder”并设为常量;6. 打开一个do … until语句并包含脚本块的左花括号;7. 开始一个if … else语句,条件是变量$i是否小于10;8. 打开if语句的脚本块,将变量$intPad赋值为0;9. 使用New – Item cmdlet在C:Mytest目录下创建新文件夹,文件夹名称由$strPrefix常量、$intPad变量的值和$i变量的值组成;10. 添加else子句;11. else脚本块与if脚本块类似,但名称中不包含$intPad变量的值;12. 将$i变量的值加1;13. 关闭else子句的脚本块并添加until语句,条件是$i变量是否等于$intFolders变量的值加1;14. 将脚本保存为yournameCreateMultipleFolders.ps1并运行。

以下是对应步骤的代码:


$intFolders = 10
$intPad
$i = 1
New-Variable -Name strPrefix -Value "testFolder" -Option constant
do {
    if ($i -lt 10) {
        $intPad = 0
        New-Item -Path c:mytest -Name ($strPrefix + $intPad + $i) -ItemType Directory
    } else {
        New-Item -Path c:mytest -Name ($strPrefix + $i) -ItemType Directory
    }
    $i++
} until ($i -eq $intFolders + 1)

将上述代码保存为

yournameCreateMultipleFolders.ps1

并运行。

22、在 Windows PowerShell 提示符下,若要获取所有服务及其关联状态的列表,应使用什么命令?

在 Windows PowerShell 中,使用

Get-Service

命令可获取所有服务及其关联状态的列表。

23、使用Sort – Object cmdlet对服务列表进行排序。为Sort – Object指定状态属性。为此,将Get – Service cmdlet的结果通过管道传递给Sort – Object cmdlet。使用Sort – Object cmdlet的sort别名以减少输入量。

Get – Service | sort -property status

24、使用 Get-Service cmdlet 生成服务列表,然后按服务名称对生成的服务列表进行字母排序。可以使用 Sort-Object cmdlet 按名称属性对服务列表进行排序,也可使用 Sort-Object 的别名 sort 来实现。请写出使用 sort 别名实现此操作的命令。

Get-Service |sort -property name

25、使用Get – Service cmdlet生成服务列表。根据服务的名称和状态对返回的对象进行排序。

Get – Service | sort status, name

26、使用Get – Service cmdlet返回一个包含服务信息的对象。将结果对象通过管道传递给Where – Object cmdlet。在显示名称中查找“server”这个词。


Get-Service | Where-Object { $_.DisplayName -match "server" }

27、使用Get – Service cmdlet检索服务对象列表。将结果对象通过管道传递给Where – Object。使用等于参数返回一个表示Alerter服务的对象。

Get – Service | where {$_.name -eq “alerter”}

28、使用向上箭头调出之前检索警报器服务的命令。将结果对象存储在名为 $a 的变量中。

$a=Get-Service | where {$_.name -eq “alerter”}

29、将 $a 变量中包含的对象通过管道传递给 Get – Member cmdlet。你可以使用 gm 别名来简化输入。

$a | gm

30、使用 $a 变量中包含的对象,获取警报器服务的状态。

$a.status

31、如果警报器服务正在运行,则停止它。为此,请使用Stop – Service cmdlet。不要将$a变量中的对象通过管道传递,而是使用Stop – Service cmdlet的 – InputObject参数。

Stop – Service -InputObject $a

32、如果警报器服务已停止,需要使用 Start – Service cmdlet 来启动服务(原本停止服务用的是 Stop – Service cmdlet),并且要使用 – inputobject 参数将 $a 变量中包含的对象提供给该 cmdlet,写出对应的命令。

Start – Service – InputObject $a

33、查询 $a 变量中对象的状态属性,以确认警报器服务的状态是否发生了变化。

$a.status

34、如何打开记事本程序(Notepad.exe)或你喜欢的脚本编辑器?

在Windows PowerShell中,可通过输入

notepad

并按回车键来启动记事本程序(Notepad.exe)。

35、打开指定的脚本文件夹,找到 WmiTemplate.ps1 文件并打开,然后将其另存为 yournameWorkingWithPrinters.ps1。同时,在该脚本文件夹中找到 WorkingWithPrinters.ps1 脚本,以此作为本练习完整解决方案的示例。

按照要求从指定脚本文件夹打开

WmiTemplate.ps1

文件

将其另存为

yournameWorkingWithPrinters.ps1

并参考该文件夹里的

WorkingWithPrinters.ps1

脚本获取练习完整解决方案示例

36、修改 $wmiQuery 行以查询 WIN32_Printer 类。


$wmiQuery

行修改为:


$wmiQuery = "Select * from win32_printer"

37、修改脚本,使其仅打印出每台打印机的名称。为此,将 name 属性添加到 Format-List cmdlet 中。

使用如下代码:$objWMIServices | Format-List name

38、要确定每台打印机的定义位置,如何将 portname 属性添加到 Format-List cmdlet 中?

可使用如下代码实现:


$objWMIServices | Format-List name, portname

39、为了限制查询返回的特定数据,可以使用什么 WQL 技术?

可以按以下步骤使用 WQL 技术限制特定数据:

连接到 WMI;

使用

WMIQuery

参数中的

Select

语句选择感兴趣的特定属性,例如

Select name

使用

WMIQuery

参数中的

From

语句指定要从中检索数据的类,例如

From Win32_Share


WMIQuery

参数中添加

Where

子句以进一步限制返回的数据集,确保

Where

子句中指定的属性先在

Select

语句中提及,例如

Where name

添加评估运算符,可使用等号(

=

)、小于(

<

)或大于(

>

)符号,例如

Where name = 'C$'

40、在创建强大的Where子句时,可以使用哪三种可能的运算符?

等号(=)、大于号(>)和小于号(<)可用于在返回数据集之前评估数据。

41、1. 打开记事本或你喜欢的 Windows PowerShell 脚本编辑器。2. 使用 Get – Content 命令行工具打开 OneStepFurther.txt 文件,使用路径参数指向该文件的确切路径,并将创建的数组保存在名为 $aryText 的变量中。3. 创建一个名为 $strUser 的变量,该变量用于确定要在 Active Directory 中创建的对象类,将字符串 “user” 赋给该变量。4. 创建一个名为 $intUsers 的变量,该变量用于确定要创建的用户数量,在本练习中要创建九个用户,将整数 9 赋给该变量。

打开记事本或者你偏好的 Windows PowerShell 脚本编辑器。

运用

Get-Content

命令打开

OneStepFurther.txt

文件,利用路径参数指明该文件的精确路径,把生成的数组存于名为

$aryText

的变量里。

创建一个名为

$strUser

的变量,该变量用于确定在 Active Directory 中要创建的对象类别,给这个变量赋值字符串

"user"

创建一个名为

$intUsers

的变量,此变量用于确定要创建的用户数量,在本次练习中要创建 9 个用户,所以给该变量赋值整数

9

42、将你的脚本保存为yournameConfigureTransportLogging.ps1,运行该脚本,几秒钟后会看到提示返回但无输出。接着运行ReportTransportLogging.ps1脚本,若没看到日志记录级别发生变化,打开ConfigureTransportLogging.ps1脚本并与你的脚本进行比较。请简述此操作的整体流程。

此步骤描述了配置和检查 Exchange 2007 传输日志记录级别的操作流程:

先运行配置脚本。

再运行报告脚本。

若日志级别未改变,则对比配置脚本。

43、打开记事本或其他Windows PowerShell脚本编辑器。找到UserNames.txt文件,并确保你可以访问该文件的路径。在脚本的第一行,创建一个名为$aryUsers的变量,用于存储通过使用Get – Content cmdlet读取包含各种用户名字和姓氏的文本文件返回的文本数组。确保根据你的计算机编辑提供给Get – Content cmdlet的路径参数的字符串。在脚本的下一行,声明一个名为$password的变量,该变量将包含用于所有用户的密码。在脚本的下一行,声明一个名为$strOU的变量,用于保存要放置新创建用户的组织单位。在下一行,声明一个名为$strDomain的变量。此变量将用于保存组织的域名。现在声明一个名为$strDatabase的变量。此变量将保存用户邮箱所在的数据库的名称。使用ConvertTo – SecureString cmdlet将$password变量中包含的字符串转换为可用于New – Mailbox cmdlet的密码参数的安全字符串。使用ForEach语句遍历通过使用Get – Content cmdlet读取文本文件创建的文本数组。使用左右花括号打开和关闭代码块。在代码块的第一行,使用变量$newAry来保存通过使用Split方法从$aryUsers变量中的一行文本创建的新数组。检索名字并将其存储在变量$strFname中。检索姓氏并将其存储在变量$strLname中。使用New – Mailbox cmdlet并为每个参数提供值。将你的脚本保存为yournameCreateUsersFromTxt.ps1。运行你的脚本。如果它没有产生预期的结果,将其与CreateUsersFromTxt.ps1脚本进行比较。

这是一个使用Windows PowerShell创建用户账户的逐步操作说明,具体步骤及对应代码如下:

打开记事本或其他Windows PowerShell脚本编辑器。

找到

UserNames.txt

文件并确保可访问其路径。

在脚本第一行创建

$aryUsers

变量:

powershell
$aryUsers = Get-Content -path "c:ch9UserNames.txt"

(需根据实际情况修改路径)

声明

$password

变量:

powershell
$password = "Password01"

声明

$strOU

变量:

powershell
$strOU = "myTestOU"

声明

$strDomain

变量:

powershell
$strDomain = "nwtraders.msft"

声明

$strDatabase

变量:

powershell
$strDatabase = "Mailbox Database"

转换

$password

为安全字符串:

powershell
$password = ConvertTo-SecureString $password -asplaintext -force

使用

ForEach

语句:

powershell
foreach ($i in $aryUsers)

打开和关闭代码块:

powershell
{
}

在代码块第一行创建

$newAry

变量:

powershell
$newAry = $i.split(',')

检索名字:

powershell
$strFname = $newAry[0]

检索姓氏:

powershell
$strLname = $newAry[1]

使用

New-Mailbox

cmdlet:

powershell
New-Mailbox -Alias $strFname$strLname -Database $strDatabase -Name $strFname$strLname -OrganizationalUnit $strOU -FirstName $strFname -LastName $strLname -DisplayName $strFname$strLname -UserPrincipalName $strFname$strLname"@"$strDomain -password $password

保存脚本为

yournameCreateUsersFromTxt.ps1

并运行,若结果不符,与

CreateUsersFromTxt.ps1

脚本比较。

44、在 Windows PowerShell 中,声明一个名为 $dteMaxAge 的变量,并使用时间跨度加速器将字符串类型转换为时间跨度数据类型,将时间跨度设置为 30 天、0 小时、0 分钟和 0 秒。创建一个名为 $intSize 的变量,并使用它来保存值 50MB。使用变量 $strLogPath 来保存表示存储邮件跟踪日志路径的字符串。使用变量 $aryServer 来保存通过使用 Get – MailboxServer cmdlet 获取的 Exchange 邮箱服务器集合。使用 ForEach 语句遍历 $aryServer 变量中保存的 Exchange 服务器集合,在代码块中,使用变量 $strServer 来保存当前遍历对象的 Identity 属性。

以下是按照要求编写的代码:


# 声明 $dteMaxAge 变量并设置时间跨度为 30 天
$dteMaxAge = [timespan]"30.00:00:00"

# 创建 $intSize 变量并保存值 50MB
$intSize = 50MB

# 使用 $strLogPath 变量保存存储邮件跟踪日志的路径
$strLogPath = "c:x2kLogs"

# 使用 $aryServer 变量保存 Exchange 邮箱服务器集合
$aryServer = Get-MailboxServer

# 使用 ForEach 语句遍历服务器集合
foreach ($strServer in $aryServer) {
    # 打开代码块
    # 使用 $strServer 变量保存对象的 Identity 属性
    $strServer = $strServer.Identity
    # 关闭代码块
}
© 版权声明

相关文章

暂无评论

none
暂无评论...