我有一个正在调用外部可执行文件的 PowerShell 脚本,并且我想抑制由此产生的任何错误。如何才能实现这一点。使用 PowerShell cmdlet,我可以使用 的标准-ErrorAction参数SilentlyContinue,但这是一个外部可执行文件:
someExe --argument
Run Code Online (Sandbox Code Playgroud) 我陷入了这个项目,我尝试使用 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) 使用 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)
我怎样才能做到这一点?
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
使用 Powershell,System.Management.Automation.Cmdlet.Invoke() 返回类型的对象'<Invoke>d__40'而不是指定的 OutputType。
重现:
powershell -NoProfileAdd-Type -Path .\ExampleCmdlet.cs$command = [SendGreeting.SendGreetingCommand]::new()$command.Name = 'Person'$invoke = $command.Invoke()$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()不直接返回预期的字符串输出?
假设我想用字符串来表示时间,就像这样
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)
如何在不将其资源分配给变量的情况下获得相同的结果?
我花了大约一个小时试图弄清楚这里发生了什么,但我根本无法找出原因,也没有意外地找到解决方法。
\n当我运行时,winget upgrade返回的数据已正确编码:
然而,如果我将 winget 升级的响应存储在变量 ( $winget = winget upgrade; $winget;) 中,某些字符会中断,这似乎是一个编码问题:
像这样的 cmdlet 将始终将字符串返回到 PowerShell,因此我猜想将响应分配给变量正在应用一些默认文本编码,也许来自我的 PowerShell 配置文件?我已经尝试将大多数常见代码投射到变量上,但最终会完全破坏数据。
\n我什至以每种可能的编码类型转储了数据,但它们都已损坏:
\nwinget 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) 该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?
这是我第一次使用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 中使用 cmdlet 时是否有一种优雅的“动态”方式来使用或不使用属性。
例如,在下面的代码中,我如何-directory根据某些条件将属性设置为存在或不存在?
gci $folder_root -recurse -directory | ForEach{
# do something
}
Run Code Online (Sandbox Code Playgroud)