标签: powershell-cmdlet

调用外部可执行文件时抑制 Powershell 错误

我有一个正在调用外部可执行文件的 PowerShell 脚本,并且我想抑制由此产生的任何错误。如何才能实现这一点。使用 PowerShell cmdlet,我可以使用 的标准-ErrorAction参数SilentlyContinue,但这是一个外部可执行文件:

someExe --argument
Run Code Online (Sandbox Code Playgroud)

error-handling powershell executable powershell-cmdlet

4
推荐指数
1
解决办法
4740
查看次数

使用 C# 中的参数执行 Powershell 脚本

我陷入了这个项目,我尝试使用 Powershell 脚本创建一个用户,但我想从我的 Windowsform 运行该脚本。

脚本如下所示:

[CmdletBinding()]
 param (
[string] $Password
)  
[SecureString] $securePassword = ConvertTo-SecureString $Password -AsPlainText -Force

CreateUser $Username $Fullname $securePassword $Groups

function CreateUser { 
Param([string] $Username, [string] $Fullname, [SecureString] $Password, [string[]] $Groups)

Process{   
New-localuser -name $Username -FullName $Fullname -password $Password | Out-Null

    Write-Host "User" $_.username "created!"
    
    AddUserToGroup($Username, $Groups)
}
}

function AddUserToGroup([string] $Username, [string[]] $Groups){
Write-Output "Hello World";
}
Run Code Online (Sandbox Code Playgroud)

我知道代码可以工作,因为当我在 Powershell 中运行它时,它就可以工作。

我需要在 C# 代码中添加 4 个参数,即用户名、全名、密码和组[数组],因为脚本中的方法需要这些参数。

当我尝试从 C# 代码运行脚本时,出现错误:

The term "" is not recognized as …
Run Code Online (Sandbox Code Playgroud)

c# powershell visual-studio powershell-cmdlet

4
推荐指数
1
解决办法
8873
查看次数

如何使 PSCmdlet bool 参数像标志一样工作?

使用 System.Management.Automation,您可以在 C# 中创建自定义 PSCmdlet。现在,如果您像这样创建布尔参数:

[Parameter()]
public bool ShowDefinition { get; set; }
Run Code Online (Sandbox Code Playgroud)

您必须像这样调用 cmdlet:

PS> Get-CustomValues -ShowDefinition 1
Run Code Online (Sandbox Code Playgroud)

但我想调用它而不将值传递给 -ShowDefinition。与 -Debug 的工作方式相同。像这样:

PS> Get-CustomValues -ShowDefinition
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

c# powershell powershell-cmdlet

3
推荐指数
1
解决办法
933
查看次数

Powershell V5.0 中缺少帮助文件

Powershell版本:5.0.10586.494

我这个周末刚刚开始使用powershell,我发现在使用shell时找不到任何帮助文件,例如,我想阅读about_Comparison_Operators帮助文件,但控制台似乎找不到它。

做的时候:Get-Help About_*我得到的唯一结果是About_CimSession...好像没有其他帮助文件?

这篇 TechNet 文章建议在 Powershell v3 中必须导入该模块,

若要下载或更新 Windows PowerShell 3.0 中模块的帮助文件,请使用 Update-Help cmdlet。

不知道我的情况是不是也是这样?我使用了 update-help cmdlet(作为管理员),它似乎不会影响帮助文件。

谢谢!

编辑:忘了提及,我在尝试更新帮助时一直以管理员身份运行 PS。运行时没有错误,但帮助文件保持不变。

更新:仍然没有运气,尝试通过使用 UICulture 参数指定语言来更新帮助,但这没有什么区别。如果我找到修复程序,将保持这篇文章的更新。

powershell windows-server-2012 powershell-5.0 powershell-cmdlet

3
推荐指数
1
解决办法
1266
查看次数

什么是“<调用>d__40”?

使用 Powershell,System.Management.Automation.Cmdlet.Invoke() 返回类型的对象'<Invoke>d__40'而不是指定的 OutputType。

重现:

  1. SendGreeting 示例 cmdlet复制到 .\ExampleCmdlet.cs
  2. powershell -NoProfile
  3. Add-Type -Path .\ExampleCmdlet.cs
  4. $command = [SendGreeting.SendGreetingCommand]::new()
  5. $command.Name = 'Person'
  6. $invoke = $command.Invoke()
  7. $invoke.GetType()

预期[string]
实际[<Invoke>d__40]

$PS版本表:

Name                           Value
----                           -----
PSVersion                      5.1.19041.1237
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.19041.1237
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
Run Code Online (Sandbox Code Playgroud)

Get-Member -InputObject $invoke揭示这个来实现IEnumerator和一些玩弄.MoveNext().Current有时会输出预期的"Hello Person!"结果。

这是什么<Invoke>d__40类型?
为什么$command.Invoke()不直接返回预期的字符串输出?

c# powershell powershell-cmdlet

3
推荐指数
1
解决办法
116
查看次数

如何将 cmdlet 插入到 powershell 中的字符串中

假设我想用字符串来表示时间,就像这样

Write-Output "It's now (Get-Date)"
Run Code Online (Sandbox Code Playgroud)

这似乎不起作用,相反:

$time = Get-Date
Write-Output "It's now $time"
Run Code Online (Sandbox Code Playgroud)

如何在不将其资源分配给变量的情况下获得相同的结果?

string variables powershell powershell-cmdlet

2
推荐指数
1
解决办法
2283
查看次数

在变量中存储 cmdlet 响应时出现 PowerShell 编码问题

我花了大约一个小时试图弄清楚这里发生了什么,但我根本无法找出原因,也没有意外地找到解决方法。

\n

当我运行时,winget upgrade返回的数据已正确编码:

\n

winget 响应已正确编码

\n

然而,如果我将 winget 升级的响应存储在变量 ( $winget = winget upgrade; $winget;) 中,某些字符会中断,这似乎是一个编码问题:

\n

winget 响应中有编码问题

\n

像这样的 cmdlet 将始终将字符串返回到 PowerShell,因此我猜想将响应分配给变量正在应用一些默认文本编码,也许来自我的 PowerShell 配置文件?我已经尝试将大多数常见代码投射到变量上,但最终会完全破坏数据。

\n

我什至以每种可能的编码类型转储了数据,但它们都已损坏:

\n
winget upgrade | Out-File -FilePath C:\\tmp\\test1.txt -Encoding ascii\nwinget upgrade | Out-File -FilePath C:\\tmp\\test3.txt -Encoding default\nwinget upgrade | Out-File -FilePath C:\\tmp\\test4.txt -Encoding string\nwinget upgrade | Out-File -FilePath C:\\tmp\\test5.txt -Encoding unicode\nwinget upgrade | Out-File -FilePath C:\\tmp\\test7.txt -Encoding utf32\nwinget upgrade | Out-File -FilePath C:\\tmp\\test8.txt -Encoding utf7\nwinget upgrade | Out-File -FilePath C:\\tmp\\test9.txt -Encoding utf8\n …
Run Code Online (Sandbox Code Playgroud)

powershell encoding character-encoding powershell-cmdlet

2
推荐指数
1
解决办法
677
查看次数

“Clear-Disk” cmdlet 的“-Sanitize”开关在 PowerShell 中起什么作用?

Clear-Diskcmdlet 似乎有一个当前未记录的 -Sanitize开关:

PS> Get-Command Clear-Disk | Select-Object -ExpandProperty ParameterSets | ? {$_.Name -like 'ByName'} | Select-Object -ExpandProperty Parameters | ? {$_.Name -like 'Sanitize'}

Name                            : Sanitize
ParameterType                   : System.Management.Automation.SwitchParameter
IsMandatory                     : False
IsDynamic                       : False
Position                        : -2147483648
ValueFromPipeline               : False
ValueFromPipelineByPropertyName : False
ValueFromRemainingArguments     : False
HelpMessage                     :
Aliases                         : {}
Attributes                      : {InputObject (cdxml), ByNumber, ByPath, ByName...}
Run Code Online (Sandbox Code Playgroud)

它有什么作用?它会触发 ATA/SCSI 命令吗SANITIZE

powershell wmi powershell-5.1 powershell-cmdlet

2
推荐指数
1
解决办法
745
查看次数

Clear-RecycleBin cmdlet 的进度条输出显示不正确

这是我第一次使用Clear-RecycleBincmdlet,很明显,这个 cmdlet 绘制了一个典型的命令行进度条,我认为它应该从头到尾填充符号或颜色块,或者也许应该只打印进度条中间的百分比值,我不太清楚,因为正如我所说,这是我第一次使用此 cmdlet,但是,看到下面的图像,显​​然进度条输出是错误的。进度条完全是“静态”的,它不会填充进度条,它只是(一次)打印几个字符,并且不会继续打印更多字符,如下图所示:

在此输入图像描述

我通过将数千个文件发送到回收站来多次测试 cmdlet,这样我就强制 cmdlet 花费时间(以分钟为单位)来完成回收操作,并且我注意到,经过多少时间并不重要此 cmdlet 正在运行,进度条输出始终相同。仅打印一定数量的“o”字符,并且它们是立即打印的,而不是渐进打印的。

我想也许这可能是某种输出编码问题,否则这个奇怪的进度条输出对我来说似乎无法解释......

我不确定出了什么问题。这是我运行此 cmdlet 的方式:

PowerShell.exe -command "[console]::WindowWidth=40; [console]::WindowHeight=6; [console]::BufferWidth=[console]::WindowWidth; Clear-RecycleBin -DriveLetter 'C' -Force -ErrorAction SilentlyContinue; Start-Sleep -Second 2"
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么我会得到这个输出以及如何修复它?

powershell powershell-cmdlet

1
推荐指数
1
解决办法
123
查看次数

您可以在 Powershell cmdlet 调用中动态设置属性吗?

我不确定这是否可行,但我想知道在 Powershell 中使用 cmdlet 时是否有一种优雅的“动态”方式来使用或不使用属性。

例如,在下面的代码中,我如何-directory根据某些条件将属性设置为存在或不存在?

gci $folder_root -recurse -directory | ForEach{ 
  # do something
}
Run Code Online (Sandbox Code Playgroud)

parameters powershell powershell-cmdlet

1
推荐指数
1
解决办法
141
查看次数