PowerShell命令与脚本问题解答

内容分享19小时前发布
0 0 0

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、你会使用哪个 cmdlet 来生成随机数?

Get-Random

2、你会使用哪个 cmdlet 来列出文件夹的内容?

Get-ChildItem

3、哪个 cmdlet 可以将输出重定向到文件?

Out-File 可以将任何 cmdlet 的输出写入文本文件。此外,大于号(

>

)是

Out-File -FilePath

的别名,双大于号(

>>

)是

Out-File -Append -FilePath

的别名,也可用于将输出重定向到文件。

4、如何使用ConvertTo – HTML cmdlet?


## ConvertTo-Html cmdlet 参数说明

`ConvertTo-Html` cmdlet 提供了一些用于格式化输出的参数,具体使用方式如下:

- **-As**:可将输出格式化为表格或列表,默认输出表格。
- **-Body**:可在 `<body>` 标签后添加文本。
- **-Head**:可在 `<head>` 部分写入文本。
- **-Title**:可为页面设置标题,只接受单个字符串。
- **-PreContent**:可在创建的表格前写入文本。
- **-PostContent**:可在表格后添加文本。
- **-Meta**:可在 `<head>` 中添加元标签。
- **-Fragment**:省略 `<head>` 和 `<body>` 标签,只输出用于生成表格的 HTML,便于将多个片段合并成一个网页。
- **-CssUri**:可指定 CSS 文件以提供额外的格式设置,如不同字体、背景颜色等。

### 示例

在 VS Code 中创建一个 CSS 文件,输入样式代码,保存为 `style.css`,存放在工作目录 `C:	empposhbook` 中。然后可在使用 `ConvertTo-Html` 时通过 `-CssUri` 参数引用该文件。

5、在 PowerShell 中,用于获取文件内容的正确 cmdlet 是 Get-Content 还是 Read-Content?

Get-Content

6、如果在 shell 中输入 “alive alive” | oh,会发生什么,为什么?


屏幕上会打印出 `alive alive`。因为 `oh` 是 `Out-Host` 的别名,它会接收一个对象(这里是字符串 `alive alive`)并将其打印到默认主机,通常是屏幕。

7、不实际尝试,Get-ChildItem c:foo -Filter

.exe,

.txt 命令能否运行?如果不能,原因是什么?

不能。

-Filter

参数只接受单个参数。若要此命令运行,可使用

Get-ChildItem c:foo* -include *.exe, *.txt

8、如何使用PowerShell仅显示今天是星期几?

使用命令

Get-Date | Select-Object DayOfWeek

,该命令可仅显示今天是星期几。

9、这里有很多内容。我们如何确保只列出 CPU 使用率大于 5 的进程?

可以使用以下命令:


Get-Process | Where-Object -Property CPU -gt -Value 5

更常见的写法是:


Get-Process | where CPU -gt 5

10、我们需要获取主目录中所有文件的大小。我们只需要文件名和以字节为单位的大小。

可以使用以下命令:


Get-ChildItem -File | Select-Object name, length

11、变量 My Variable 有什么问题?

变量名中有空格,而空格不被允许。若确实要在变量名中使用空格,必须用花括号括起来,即

{My Variable}

,但这比使用无空格的变量名更麻烦。

12、我们如何改变PowerShell显示错误的视图?

可以通过设置自动变量

$ErrorView

来改变。在 PowerShell 7 中,默认值为

ConciseView

,可通过输入

$ErrorView = "NormalView"

将其设置为

NormalView

以获取更多错误信息。

13、我们如何比较两个整数?

可以使用

if-else

语句来比较两个整数。例如在比较变量

$guess


$hidden

时,代码如下:


if ($guess -ne $hidden) {
    <# Action to perform if the condition is true #>
} else {
    Write-Host "You Win"
}

还可以进一步判断大小:


if ($guess -lt $hidden) {
    Write-Host "Higher!"
} elseif ($guess -gt $hidden) {
    Write-Host "Lower!"
}

其中:

-ne

表示不相等

-lt

表示小于

-gt

表示大于

14、如何将字符串中的每个字符放入数组中?

可以使用

ToCharArray()

方法,示例代码为:


stringVariable.ToCharArray()

其中

stringVariable

是字符串变量(注意在实际使用时需将

stringVariable

替换为具体的字符串变量名)。

15、执行命令 Write-Output ‘My Name is $MyName’ 会出现什么问题,为什么?

使用单引号包裹字符串时,变量不会被解析。所以此命令会原样输出

'My Name is $MyName'

,而不会将

$MyName

替换为其实际值。

16、代码 $x = 4 ; IF ($x -gt 4) {Write-Host ‘$x is larger than 4’} 会产生什么输出?

下面是给定的【文本内容】:

无输出。该语句仅在 $ x $ 大于 4 时产生输出,这里 $ x $ 等于 4,不满足条件,且没有

else

语句提供替代输出。

17、编写一个语句,当 $x 不大于 4 时,将 $x 的值设为 4,并且当 $x 大于 4 时,输出 ‘$x is larger than 4’。


$x = if ($x -le 4) { 4 } else { $x }; 
if ($x -gt 4) { 
    Write-Host '$x is larger than 4' 
}

18、编写一个语句,当 $x 恰好为 4 时,能产生输出。原代码为 $x = 4 ; IF ($x -gt 4) {Write-Host ‘$x is larger than 4’}


$x = 4
IF ($x -gt 4) {
    Write-Host '$x is larger than 4'
} elseif ($x -lt 4) {
    Write-Host '$x is smaller than 4'
} else {
    Write-Host '$x is 4'
}

19、编写一个语句,当$x不大于4时,将$x赋值为4。并且使用三元运算符判断$x是否大于4,若大于4则输出’$x is larger than 4’,否则不做额外输出。


$x = if ($x -le 4) { 4 } else { $x }; 
($x -gt 4) ? (Write-Host '$x is larger than 4') : $null

20、重写语句 $number = 0 ; Do {$number ++ ; Write-Host “Number is $number”} While ($number -eq 5) 使其能正常工作,但不使用 do until 循环。


$number = 0
Do {
    $number++
    Write-Host "Number is $number"
} While (!($number -eq 5))

21、使语句 For ($i = 0 ; $i -lt 5 ) {Write-Host $i} 正常运行。

原语句缺少一个分号来分隔条件和循环体,正确的语句应该是:


For ($i = 0 ; $i -lt 5 ; $i++) {Write-Host $i}

添加了

$i++

作为循环的迭代部分。

22、我们应该只在循环和另一个地方使用break和continue语句。另一个地方是哪里?

switch语句

23、如何以三列的宽列表形式列出临时目录中所有文件的名称?

可以使用以下命令:


Get-ChildItem -Path $env:TEMP | Format-Wide -Column 3 -Property Name

其中:

$env:TEMP

代表临时目录路径

Format-Wide -Column 3 -Property Name

用于以三列宽列表形式显示文件名称

24、使用 PowerShell,将字符串 “I love PowerShell” 写入当前工作目录下的一个新文件。

可使用

Out-File

命令,示例代码如下:


'I love PowerShell' | Out-File -FilePath .
ewfile.txt

其中

newfile.txt

可根据需求修改文件名。

25、以下错误 ‘Import-Clixml: Element ‘Objs’ with namespace name ‘http://schemas.microsoft.com/powershell/2004/04’ was not found.’ 告诉了我们什么?

该错误表明XML文件的架构对于

Import-Clixml

cmdlet来说是不正确的,文件中缺少重要的行。

26、我们如何向以下 URL(https://httpbin.org/delete)发送删除请求?


Invoke-WebRequest -Uri 'https://httpbin.org/delete' -Method Delete

27、哪种类型的 API 是有状态的?这意味着什么?

有状态的 API 类型是 RPC API(历史上是有状态的,现代实现通常不是)、WebSocket API。

有状态意味着客户端和服务器之间的连接会在多个请求中保持,而无状态则是客户端的每个请求都被视为一个独立事件,不会将任何信息延续到下一个请求。

28、我们注册了一个网络服务并获得了一个认证令牌。我们使用ConvertTo – SecureString对令牌进行编码,将其存储在名为$token的变量中,然后使用该变量创建一个网络请求,如下所示:Invoke – WebRequest – Uri ‘https://webservice.com/endpoint’ – Headers @{Authorization = “Bearer $token”}。我们收到了认证错误。是我们做错了什么,还是令牌有问题?

我们做错了。如果通过

-Headers

参数提供令牌,不能使用

ConvertTo-SecureString

对令牌进行编码。

29、获取国际空间站(ISS)当前的纬度和经度。你可以使用 http://api.open-notify.org/iss-now.json。

可以使用以下命令获取:


Invoke-RestMethod 'http://api.open-notify.org/iss-now.json' | Format-List iss_position

30、英国有多少所大学的名称中包含字母“x”?使用 http://universities.hipolabs.com/search?country=United+Kingdom 这个 API 来查找答案。

作者得到的结果是 8,但这个数字可能会发生变化。

31、当我们尝试运行自己编写的脚本时,同一台机器上的另一个用户收到一条错误消息,称此系统上禁止运行脚本。我们必须做什么才能允许他们运行该脚本?

如果是Windows系统,可运行命令:


Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

这将允许当前用户运行本地编写的脚本或从互联网下载且包含代码签名的脚本;

如果是Linux或Mac客户端,由于其安全实现方式不同,策略实际上是不受限制的,无需进行额外操作。

32、我们有一个喜欢《龙与地下城》的年轻亲戚,但他们丢了20面骰子。我们为他们编写了一个简短的PowerShell脚本Get – Die.ps1,内容如下:Get – Random – Minimum 1 – Maximum 20。每次运行该脚本时,都会生成一个1到20之间的随机数。如果他们丢了另一个不同面数的骰子,这行代码中哪个值最有可能改变?

Maximum后面的值,即20

33、参数应该是什么类型,以及我们如何指定它?

可以指定参数类型,方法是在变量前输入属性,就像指定变量类型一样。例如,将

$City = "London"

替换为

[String]$City = "London"

,可将传入

-City

参数的内容转换为字符串;还可指定参数为

[int]

类型,如

[int]$number

;对于开关参数,指定类型为

[switch]

,如

[switch]$heads

此外,还能通过

Mandatory


Position


ParameterSetName

等参数属性来进一步定义参数。如使用

Mandatory

确保参数有值,使用

Position

指定参数位置,使用

ParameterSetName

定义特定参数集的参数。

34、他们喜欢这个脚本,现在他们弄丢了四面骰子。他们发现可以在参数中输入任意数字。一开始这很酷,但现在他们希望脚本只允许他们掷游戏《龙与地下城》中使用的骰子。《龙与地下城》使用四面、六面、八面、十面、十二面和二十面骰子,该怎么做?

可以将4、6、8、10、12、20添加到参数的ValidateSet属性中,以限制只能输入这些值。

35、他们注意到有时会忘记输入骰子的数量,结果总和为0。我们如何防止这种情况发生?

这是因为没有为骰子数量参数分配默认值。我们可以为其分配一个默认值,但更好的做法是通过添加

[Parameter(Mandatory)]

使其成为必需参数,如下所示:


param(
    [ValidateSet(4,6,8,10,12,20)][int]$Sides = 20,
    [Parameter(Mandatory)][int]$Dice
)

36、当用户不确定该在参数中输入什么内容时,怎样才能让他们更轻松地使用相关系统或程序?

可以通过以下四种方式提供帮助让他们更轻松使用:

对代码添加注释,帮助自己和他人理解;

创建基于注释的帮助,以便与

Get-Help

cmdlet 配合使用;

使用

Write-Verbose

cmdlet,了解脚本正在执行的操作;

为必需参数提供帮助信息。

37、为什么我们在使用点源(dot sourcing)时要非常小心?

使用点源会将脚本的成员、变量和函数引入父作用域,移除了作用域对模糊代码的保护。交互式点源脚本会将函数引入全局作用域且难以移除,脚本中函数外的变量也会被引入,若变量命名不佳,可能与现有重要变量冲突。

38、我们创建了一个名为 $ScriptBlock 的变量,并将一个脚本块赋值给它。如果我们这样调用它:$ScriptBlock ,却没有得到预期的输出。为什么?

如果直接调用变量,我们得到的是脚本块的内容,而不是输出。若要运行脚本块,可使用以下方法:

Invoke-Command

脚本块的

invoke()

方法

调用运算符

(&)

点源操作符

(.)

39、函数和脚本块的主要区别是什么?


函数由函数关键字、名称和脚本块(花括号内的一组语句)组成,关键字为调用脚本块提供标签;脚本块使用时不需要关键字。函数可将参数放在括号内附在名称后,脚本块不能这样做,只能用 `param()` 块创建参数。

40、代码

Function get - square($a) {$a*$a} 15 | get - square

存在什么问题,如何修正?

代码中使用管道符号将值传递给函数

get - square

存在问题。

get - square

函数没有设置接收管道输入的参数,所以无法通过管道接收值。要让代码正常工作,可直接调用函数并传入参数,如

get - square 15

41、如何编写一个函数来获取准确的平方根?请完成以下函数代码:function get_root($a) { <这里应该写什么?> }

42、在运行脚本时,终止性错误和非终止性错误的主要区别是什么?

终止性错误会使 PowerShell 完全停止,脚本或管道运行中断;非终止性错误会记录错误,若可能则继续运行,除非另有指定。

43、我们如何访问关于错误的详细信息?

可以通过以下方式访问错误详细信息:

首先,将

$ErrorView

变量设置为

NormalView

,命令为:

powershell
$ErrorView = "NormalView"

然后,使用

Get-Error

命令查看生成的整个错误对象,

Get-Error

是 PowerShell 7 的 cmdlet,可访问存储在

$Error

变量中的错误。

还能使用

Get-Error

搭配

-Newest

参数加整数来获取指定数量(从最近的开始)的错误,例如:

powershell
Get-Error -Newest 5

也可以使用标准语法

$Error[0]

来获取最近的错误,例如:

powershell
$Error[0]

44、PowerShell 中 -ErrorActionPreference 变量的用途是什么?

该变量允许我们为特定 PowerShell 会话中运行的所有 cmdlet 和脚本设置默认错误操作首选项,它决定了错误是

应该显示



忽略

还是以

特定方式处理

45、PowerShell中Write – Error cmdlet的用途是什么?

Write – Error cmdlet用于向用户告知出现了问题,但让脚本继续执行其正在进行的操作。它会在控制台输出红色消息,且这个错误是非终止性的。错误信息也会写入

$Error

变量,可通过

$ErrorActionPreference

变量控制其显示。

46、为什么我们可能想要使用Throw语句?

Throw语句用于在脚本中创建终止错误,使脚本在该点停止并记录异常,例如将异常写入日志。

47、如何在脚本中显示调试消息?

可以使用

Write-Debug

生成调试消息,并使用

-Debug

参数访问调试输出流以查看这些消息。

48、如何在脚本中编写调试消息,这些消息是为谁编写的?

可使用

Write-Debug

cmdlet 编写调试消息。要使用该 cmdlet,需确保脚本是高级脚本,使用

CmdletBinding

属性。使用该属性后可访问

-Debug

参数。这些调试消息是为开发者编写的。

49、在 PowerShell 中,什么是断点?

断点是在脚本中设置的标记,用于在特定行或条件下暂停脚本执行,允许我们检查该点处脚本和变量的状态。设置和操作断点的 cmdlet 都使用

PSBreakpoint

名词,相关 cmdlet 有

Set-PSBreakpoint


Get-PSBreakpoint


Remove-PSBreakpoint


Disable-PSBreakpoint


Enable-PSBreakpoint

50、调试器命令 stepOver 的作用是什么?

StepOver 会将我们带到下一条语句;如果该语句是一个函数,调试器将直接运行该函数,而不会逐行执行。

51、如何列出当前 PowerShell 会话中所有已导入的模块?

使用 Get-Module 命令。

52、我们想导入一个模块,该模块包含的函数与当前会话中已存在的 cmdlet 同名。我们可以通过哪两种方法来解决这个问题?

可以使用

-Prefix

参数为从模块导入的 cmdlet 中的名词添加前缀,以避免与会话中已存在的 cmdlet 混淆;也可以使用

-NoClobber

参数,防止与会话中已存在的 cmdlet 同名的 cmdlet 被导入。

53、默认情况下,模块的所有函数都会被导出。我们可以通过哪两种方式来控制导出哪些函数?

使用

Export-ModuleMember

cmdlet 指定要导出的函数,如:

powershell
Export-ModuleMember -Function Write-Message

使用

Export-ModuleMember

cmdlet 指定要导出的变量和别名,如:

powershell
Export-ModuleMember -Variable $MyVariable

注:原答案表述此处是导出变量和别名,但举例仅为变量,需注意导出别名时使用

-Alias

参数。

54、带有.ps1xml扩展名的文件可能包含什么内容?

带有.ps1xml扩展名的文件可能包含用于显示函数输出的格式化信息

55、如果我们加载一个扩展名为.dll的模块,我们会得到哪种类型的命令?

我们会得到导出的cmdlet,而不是导出的函数。

56、如何在 Linux 上安全地使用 PowerShell 远程连接?


Linux 不支持 WinRM 协议,需使用 SSH 进行远程管理。首先要检查 PowerShell 7 版本是否有 OpenSSH 支持,使用命令 `(Get-Command New-PSSession).ParameterSets.Name`,若看到名为 `SSHHost` 和 `SSHHostHashParam` 的参数集则可以使用,若没有则从 GitHub 下载最新版本的 PowerShell 7。

在 Windows 上,若要远程连接到 Windows 机器则需安装 OpenSSH,若从 Windows 机器远程连接到其他机器则可跳过安装,因为 PowerShell 已有可用于通过 PowerShell 远程连接到 Linux 机器的 SSH 客户端。

SSH 协议依赖公钥加密,需生成密钥对并将公钥传递到要远程连接的系统,后续打开会话时指定本地私钥的路径,SSH 会验证远程机器上的公钥与本地私钥是否为一对,私钥不会在网络上传输。

57、PowerShell中哪种执行策略只允许已签名的脚本运行?

AllSigned策略允许带有受信任发布者数字签名的脚本运行,即只允许已签名的脚本运行。

58、-ExecutionPolicy Bypass 开关的用途是什么?

该开关可绕过执行策略,即不阻止任何操作,也不会有警告,执行策略被忽略。可通过调用

pwsh.exe

程序的

-ExecutionPolicy

参数来设置。

59、在 Windows 系统上,什么可以用于分析和阻止已知的恶意脚本和配置?

可以使用应用程序控制解决方案,如 Windows Defender Application Control (WDAC) 和 AppLocker 来创建策略,强制实施允许执行的应用程序白名单,并阻止其他任何程序运行。


AppLocker

:不再开发,推荐使用 WDAC。

此外,执行策略也是一项安全功能,它控制脚本的运行方式,有不同的安全级别和应用范围,可在一定程度上阻止用户运行潜在的破坏性脚本。

© 版权声明

相关文章

暂无评论

none
暂无评论...