Powershell ISE 默认将所有文件保存为“Unicode Big Endian”(UTF-16)编码。以下代码将在 ISE 中创建一个菜单项并分配一个热键(默认为 Ctrl-Shift+E)以使用指定的编码(而非 UTF-16)将文件保存在当前 PowerShellISE 选项卡中。我将其设置为 UTF-8,但如果需要,您可以使用 ASCII 或其他内容。
$iseProfile = $profile -replace '_profile','ISE_profile'
$addMenuCmdStr = '$psISE.CurrentPowerShellTab.AddOnsMenu.SubMenus.Add("_Save as UTF8",{$psIse.CurrentFile.Save([System.Text.Encoding]::UTF8)},"Ctrl+Shift+E")'
add-content $iseProfile -value $addMenuCmdStr
ise
PS C:\> foreach ($a in "a","b","c") { write $a }
a
b
c
将目录更改为 UNC 路径:
PS C:\> cd \\kcws\c$
PS Microsoft.PowerShell.Core\FileSystem::\\kcws\c$>
获取运行服务:
PS C:> 获取服务 | 其中{$_.status -eq“运行”}
Status Name DisplayName
------ ---- -----------
Running AeLookupSvc Application Experience
Running Appinfo Application Information
Running AudioEndpointBu... Windows Audio Endpoint Builder
Running Audiosrv Windows Audio
[...]
强制 Powershell 函数真正返回一个数组,甚至是一个空数组。
由于@() 语法的实现方式,函数可能并不总是按预期返回一个数组,例如以下代码将返回一个$null 而不是一个空数组。如果您使用 set 测试代码,则在尝试引用该属性时
set-StrictMode -On
会出现错误:PropertyNotFoundStrict
.count
只需将 a 添加
,
到@()
将绕过“语法糖”,您将返回一个实际的数组,即使它是空的:制作您自己的自定义函数并将它们保存在您的配置文件中。您可以构建大量有用的功能,而无需在每次出现类似问题时都重新考虑。
编辑您的个人资料:
Add-Type -Assembly
使用程序集名称或dll 路径访问任何 .net 类Add-Type -Path
,然后使用类似[Namespace.Dotted.ClassName+NestedClass]::StaticMethod()
创建New-Object Namespace.Dotted.ClassName
或调用类型上的静态方法/字段的语法。在 ISE 中使用不同于 UTF-16 的编码保存文件。
Powershell ISE 默认将所有文件保存为“Unicode Big Endian”(UTF-16)编码。以下代码将在 ISE 中创建一个菜单项并分配一个热键(默认为 Ctrl-Shift+E)以使用指定的编码(而非 UTF-16)将文件保存在当前 PowerShellISE 选项卡中。我将其设置为 UTF-8,但如果需要,您可以使用 ASCII 或其他内容。
这个技巧对于避免 PowerShell 脚本的某些问题很有用,例如:
Subversion(可能是其他 CVS 系统)将 .ps1 文件作为二进制而不是纯文本添加到存储库中,不允许您“区分”脚本,因为它们是“二进制”,或者生成无法添加文件的错误因为它是“二进制 mime 类型”。将编码更改为 UTF-8 应该允许您的文件使用 svn:mime-type/text-plain 添加到存储库中,并允许 diff 函数工作。
使用 set-AuthenticodeSignature 对某些文件而不是其他文件签名代码失败
可能其他情况是文件内容操作适用于某些文件而不适用于其他文件,通常没有明显的原因,但一个症状是只有使用 ISE 创建的文件有问题。
飞溅。你可以在 Hashtable 中定义一堆参数,然后将其用作函数的参数。
将我的移动到一个答案,所以我不会因为把它变成一个 commwiki 而感到难过。
Foreach 循环:
将目录更改为 UNC 路径:
获取运行服务:
PS C:> 获取服务 | 其中{$_.status -eq“运行”}
这更像是一个不明显的麻烦,但我曾经编写了一个脚本来生成一个 CSV 文件作为旧可执行文件 ofiller.exe 的输入,该可执行文件与检查点防火墙一起使用。
我正在使用输出重定向:
Script.ps1 > outfile.csv
我的 powershell 创建的 CSV 文件不起作用,而我的手写测试 CSV 文件运行良好,即使这两个文件的差异相同。只有当我查看文件的大小时,我才意识到这是一个 Unicode Vs ASCII 问题;powershell CSV 是原来的两倍。
将我的输出连接到
| Out-File -format ASCII -name outfile.csv
而不是廉价和愉快的 STDOUT 重定向解决了这个问题。