在我的文件服务器上工作时,我注意到一个破坏我脚本的奇怪文件夹.文件夹的名称只包含一个ascii值为160的字符(不间断空格,NBSP).在视觉上,该名称与空格字符相同.
简而言之,我已经Get-ChildItem在这个文件夹上执行,它正在进入无限循环.命令实际上是针对父文件夹执行的,它又返回有问题的文件夹,所以我的脚本进入无限循环.
您可以在自己的环境中轻松模拟这一点.在C:\temp文件夹中创建名称仅包含NBSP的新文件夹.您可以使用按住alt并在数字键盘上按0160键入.创建后,运行
Get-ChildItem C:\Temp\ -Recurse
Run Code Online (Sandbox Code Playgroud)
虽然我只有一个文件夹,但你会得到无名的文件夹列表.
d----- 6/15/2017 2:20 PM
d----- 6/15/2017 2:20 PM
d----- 6/15/2017 2:20 PM
d----- 6/15/2017 2:20 PM
d----- 6/15/2017 2:20 PM
. . .
Run Code Online (Sandbox Code Playgroud)
我在PowerShell 4和5上对服务器和客户端操作系统进行了测试,结果与此相同.命令Get-Item也有这个名称的问题,并且两个开关-Path和-LiteralPath行为都以相同的方式.我也试过[System.IO.Directory]课,但它有同样的问题.
问题:我已更新我的脚本以报告带有此名称的文件夹作为错误并跳过它,但我想知道是否有更聪明的方法来做到这一点?我的目标是Get-ChildItem对这样的文件夹运行或等效.
这是一个已知的问题?如果被更多人确认,那么值得在某处报告它作为一个错误吗?
为了解决这个问题,我将这个简单的脚本保存为 PowerShell 模块 ( test.psm1)
Write-Verbose 'Verbose message'
Run Code Online (Sandbox Code Playgroud)
在现实生活中,它包括导入附加功能的命令,但目前无关紧要。
如果我跑,Import-Module .\test.psm1 -Verbose -Force我只会得到
VERBOSE: Loading module from path 'C:\tmp\test.psm1'.
Run Code Online (Sandbox Code Playgroud)
我的Write-Verbose被忽略
我尝试添加cmdletbinging但它也不起作用。
[cmdletbinding()]
param()
Write-Verbose 'Verbose message'
Run Code Online (Sandbox Code Playgroud)
任何线索如何在导入 PowerShell 模块时提供详细输出?
PS我不想总是显示详细信息,但只有在-Verbose指定时才显示。这是我对这两种不同情况的预期输出:
PS C:\> Import-Module .\test.psm1 -Verbose -Force # with verbose output
VERBOSE: Loading module from path 'C:\tmp\test.psm1'.
VERBOSE: Verbose message
PS C:\> Import-Module .\test.psm1 -Force # without verbose output
PS C:\>
Run Code Online (Sandbox Code Playgroud)