为何PowerShell的New-Filename函数返回值前会带数字与空格?
问题原因分析
问题出在New-Filename函数中的$junkFiles.Add($fileName)语句:
System.Collections.ArrayList的Add()方法会返回新元素在列表中的索引位置(第一次添加返回0,第二次返回1,依此类推)。而PowerShell函数的默认行为是:把所有未被赋值、未被抑制的命令输出,都作为函数的返回内容。
在你的代码里,$junkFiles.Add($fileName)的返回值(索引数字)没有被处理,它会和return $fileName的内容一起被函数输出,最终函数返回的是一个包含两个元素的数组:[索引数字, 生成的文件名]。
当你执行$foo = $(New-Filename 'txt')时,$foo接收的就是这个数组:
Write-Host "File name: $foo"会把数组元素用空格拼接,所以输出0 OHwnDEMP.txt这类内容New-Item -Path $foo会将数组中的每个元素都当作独立路径,因此会创建两个文件:一个是名为索引数字(比如0、1)的文件,另一个是正常的随机文件名
解决方法
只需要捕获或抑制Add()方法的返回值即可,有两种常用方式:
方式1:将返回值赋值给$null
function New-Filename($extension) { $fileName = "$(New-RandomString).$extension" $null = $junkFiles.Add($fileName) # 捕获Add的返回值,避免输出到函数返回结果中 return $fileName }
方式2:用Out-Null抑制输出
function New-Filename($extension) { $fileName = "$(New-RandomString).$extension" $junkFiles.Add($fileName) | Out-Null # 抑制Add的返回值输出 return $fileName }
额外提醒:PowerShell中的return只是提前终止函数,函数的返回值是所有未被捕获的输出集合,这和C#等编译型语言的return行为有差异,写代码时需要注意这一点。
内容的提问来源于stack exchange,提问作者Mike Bruno
相关产品推荐
相关产品推荐

