新项目弄乱了我的变量 PowerShell
New-Item messing up my variable PowerShell
我写了一个非常简单的脚本来获取一个随机的免费盘符。
该函数找到一个随机的空闲字母,创建一个新的空文本文件,该文件名为该驱动器号,例如。 Q.txt
然后我 return 值作为 $new_letter 但是当它以某种方式从函数中出来时,新文件创建的路径是变量 C:\AppPack\Logs\Q.txt Q
的一部分
是不是 New-Item
弄乱了我的 $new_letter
变量?
function get_drive_letter()
{
$letter_acquired = $false
Do
{
$new_letter = Get-ChildItem function:[h-z]: -Name | ForEach-Object { if (!(Test-Path $_)){$_} } | random -Count 1 | ForEach-Object {$_ -replace ':$', ''}
write-host ("RIGHT AFTER " + $new_letter)
if (!(test-path "C:\AppPack\Logs$new_letter.txt"))
{
New-Item -Path C:\AppPack\Logs\ -Name "$new_letter.txt" -ItemType "file"
write-host ("FROM FUNCTION " + $new_letter)
$letter_acquired = $true
return $new_letter
}
else
{
write-host ("LETTER USED ALREADY")
write-host ($new_letter)
}
}
while($letter_acquired = $false)
}
$drive_letter = $null
$drive_letter = get_drive_letter
write-host ("RIGHT AFTER FUNCTION " + $drive_letter)
输出:
RIGHT AFTER Q
FROM FUNCTION Q
RIGHT AFTER FUNCTION C:\AppPack\Logs\Q.txt Q
PowerShell 函数输出 所有内容,而不仅仅是 return
!
之后的表达式结果
您看到的附加文件路径是 New-Item ...
的输出 - 它 returns 是您刚刚创建的文件的 FileInfo
对象。
您可以通过将其分配给特殊的 $null
变量来抑制输出:
# Output from New-Item will no longer "bubble up" to the caller
$null = New-Item -Path C:\AppPack\Logs\ -Name "$new_letter.txt" -ItemType "file"
return $new_letter
或者通过管道传送到 Out-Null
:
New-Item ... |Out-Null
或者将整个管道转换为 [void]
:
[void](New-Item ...)
尽管我建议在调用站点明确处理不需要的输出,但您可以 也可以使用 提升技巧 来解决此问题。
为了演示,请考虑这个虚拟函数 - 假设我们从一位并不总是编写最直观代码的同事那里“继承”了它:
function Get-RandomSquare {
"unwanted noise"
$randomValue = 1..100 |Get-Random
"more noise"
$square = $randomValue * $randomValue
return $square
}
上面的函数会输出3个对象——两个垃圾串一个接一个,然后是我们真正感兴趣的结果:
PS ~> $result = Get-RandomSquare
PS ~> $result
unwanted noise
more noise
6400
假设我们被告知要尽可能少地进行修改,但我们确实需要抑制垃圾输出。
为此,将整个函数体嵌套在一个新的脚本块文字中,然后使用点源运算符 (.
) 调用整个块 - 这会强制 PowerShell 在函数的 local 作用域,意味着任何变量赋值仍然存在:
function Get-RandomSquare {
# suppress all pipeline output
$null = . {
"unwanted noise"
$randomValue = 1..100 |Get-Random
"more noise"
$square = $randomValue
return $square
}
# variables assigned in the block are still available
return $square
}
我写了一个非常简单的脚本来获取一个随机的免费盘符。
该函数找到一个随机的空闲字母,创建一个新的空文本文件,该文件名为该驱动器号,例如。 Q.txt
然后我 return 值作为 $new_letter 但是当它以某种方式从函数中出来时,新文件创建的路径是变量 C:\AppPack\Logs\Q.txt Q
是不是 New-Item
弄乱了我的 $new_letter
变量?
function get_drive_letter()
{
$letter_acquired = $false
Do
{
$new_letter = Get-ChildItem function:[h-z]: -Name | ForEach-Object { if (!(Test-Path $_)){$_} } | random -Count 1 | ForEach-Object {$_ -replace ':$', ''}
write-host ("RIGHT AFTER " + $new_letter)
if (!(test-path "C:\AppPack\Logs$new_letter.txt"))
{
New-Item -Path C:\AppPack\Logs\ -Name "$new_letter.txt" -ItemType "file"
write-host ("FROM FUNCTION " + $new_letter)
$letter_acquired = $true
return $new_letter
}
else
{
write-host ("LETTER USED ALREADY")
write-host ($new_letter)
}
}
while($letter_acquired = $false)
}
$drive_letter = $null
$drive_letter = get_drive_letter
write-host ("RIGHT AFTER FUNCTION " + $drive_letter)
输出:
RIGHT AFTER Q
FROM FUNCTION Q
RIGHT AFTER FUNCTION C:\AppPack\Logs\Q.txt Q
PowerShell 函数输出 所有内容,而不仅仅是 return
!
您看到的附加文件路径是 New-Item ...
的输出 - 它 returns 是您刚刚创建的文件的 FileInfo
对象。
您可以通过将其分配给特殊的 $null
变量来抑制输出:
# Output from New-Item will no longer "bubble up" to the caller
$null = New-Item -Path C:\AppPack\Logs\ -Name "$new_letter.txt" -ItemType "file"
return $new_letter
或者通过管道传送到 Out-Null
:
New-Item ... |Out-Null
或者将整个管道转换为 [void]
:
[void](New-Item ...)
尽管我建议在调用站点明确处理不需要的输出,但您可以 也可以使用 提升技巧 来解决此问题。
为了演示,请考虑这个虚拟函数 - 假设我们从一位并不总是编写最直观代码的同事那里“继承”了它:
function Get-RandomSquare {
"unwanted noise"
$randomValue = 1..100 |Get-Random
"more noise"
$square = $randomValue * $randomValue
return $square
}
上面的函数会输出3个对象——两个垃圾串一个接一个,然后是我们真正感兴趣的结果:
PS ~> $result = Get-RandomSquare
PS ~> $result
unwanted noise
more noise
6400
假设我们被告知要尽可能少地进行修改,但我们确实需要抑制垃圾输出。
为此,将整个函数体嵌套在一个新的脚本块文字中,然后使用点源运算符 (.
) 调用整个块 - 这会强制 PowerShell 在函数的 local 作用域,意味着任何变量赋值仍然存在:
function Get-RandomSquare {
# suppress all pipeline output
$null = . {
"unwanted noise"
$randomValue = 1..100 |Get-Random
"more noise"
$square = $randomValue
return $square
}
# variables assigned in the block are still available
return $square
}