【发布时间】:2021-05-06 20:01:41
【问题描述】:
我编写了一个非常简单的脚本来获取一个随机的空闲驱动器号。
该函数找到一个随机的空闲字母,创建一个具有该驱动器字母名称的新空文本文件,例如。 Q.txt
然后我将值返回为 $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
【问题讨论】:
-
函数返回函数中运行的所有命令的所有输出。
-
@js2010 我也更新了我的 Do- 虽然我不能只返回一个变量值吗?
-
顺便说一句,
while($letter_acquired = $false)与while($false)没有什么不同 - 你会希望while($letter_acquired -eq $false)(我更喜欢while(-not $letter_acquired))让它按照你想要的方式工作 -
您必须隐藏所有其他命令的输出,例如
new-item file5 > $null。 Return 并没有真正做到你认为的那样。只是从代码中分支出来。 -
简而言之:任何输出——无论是来自 PowerShell 命令还是 .NET 方法调用——既不是在变量中捕获也不是重定向(通过管道或文件发送)是 隐式输出。要简单地丢弃此类输出,请使用
$null = ...。如果您不丢弃此类输出,它将成为脚本或函数“返回值”(输出对象流)的一部分。请参阅 this answer 链接的副本。
标签: function powershell variables new-item