【发布时间】:2017-01-20 03:55:58
【问题描述】:
我看到这个问题被问了很多,但我没有看到任何东西解释了我为什么会遇到这个问题......如果有人能把我从精神错乱的边缘带回来,我会非常感激。
这是一个代码示例。
$Browse_IE_Click = { $Browse_Identifier = "1"; & $Browse_Click }
$Browse_Click = {
[void][System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")
$File_Browse = New-Object System.Windows.Forms.OpenFileDialog
[void]$File_Browse.ShowDialog()
$fullpath = $File_Browse.FileName
$file = Split-Path -Path $File_Browse.FileName -Leaf
If ($Browse_Identifier -eq "1") { $Flash_IE_New.Text = "New: " + "$($file)"; $Flash_IE_File = $file }
} # End Browse_Click
$Save_Click = {
If ($Flash_IE_New.Text -ne "New: ") {
Remove-Item -Path "$dir\Files\Installs\$Flash_IE_Current_File"
Copy-Item $fullpath "$dir\Files\Installs\$Flash_IE_File"
} # End If
} # End Save_Click
有一个带有多个浏览按钮的 GUI。每个浏览按钮都转到它自己的$Browse_Something_Click 脚本块,该脚本块给它一个识别号,然后转到$Browse_Click。这是我节省空间的方式,并且只有一个真正的 Browse 脚本块。
无论如何,整个选择的文件和路径被放入$fullpath,它也被分割成文件名$file。根据选择的浏览按钮,它会将“文件”保存到更具体的变量中,在本例中为 $Flash_IE_File。
如果选择了某些内容,则单击“保存”按钮时,它会删除文件夹中的当前文件并将新选择的文件复制到同一文件夹中。
除了 Copy-Item 行之外,一切正常。我尝试添加-Path 和-Destination,还尝试将$fullpath 放在引号和\或$($fullpath) 中。我尝试将$fullpath = $File_Browse.FileName 移动到If ($Browse_Identifier -eq "1") 语句中的不同位置。我尝试将其拆分,因此我只保存父路径,然后为使用$parent\$file 的复制路径而不是保存整个路径。那时我收到一个关于路径不是驱动器号或 UNC 路径的新错误。没有任何效果。
我尝试通过 Powershell 控制台运行测试,它运行良好。我浏览,保存到一个变量,将该变量复制到另一个位置,没有问题。
救命!
【问题讨论】:
-
您是否确定在您期望的相关变量中获得了正确的数据? '$File_Browse.FileName' 可能并不完全包含您所希望的内容,当您实际复制一个项目时,它确实是空的。尝试在您的 gui 中添加一个文本框,并在单击按钮时使用变量的内容填充它作为快速仔细检查。
-
变量的作用域是:
&{ $Var = 1; &{ $Var = 2; $Var }; $Var},因此在内部块中设置变量不需要更改外部块中的变量。 -
感谢您的回复,Windos。在 powershell 控制台测试期间,它包含了我认为它应该包含的内容。此外,
$Flash_IE_New.Text = "New: " + "$($file)"部分是 GUI 上的标签,可随着所选文件名正确更改。我不确定那个点和 Copy-Item 点之间发生了什么变化。我认为该值应该是正确的,因为它将整个路径保存到$fullpath变量,然后再拆分它以获取文件名(在 GUI 中很好地显示)。它适用于$file变量,为什么它不适用于$fullpath?这就是我迷路的地方。 -
谢谢,PetSerAl。该脚本的其余部分具有在多个脚本块和函数中使用的相同变量,并且这些值可以毫无问题地延续。这是我第一次遇到这种情况。
-
所以我只是尝试了一些方法 - 我将 Copy-Item 行移到了
If ($Browse_Identifier -eq "1")语句的末尾,它复制了它,没问题。所以这是一个范围问题?有什么建议可以解决这个问题吗?