我的任务是编写一个 powershell 脚本来执行文件下载,最终将作为计划任务每周执行一次。我没有在 Windows 环境中编程的背景,所以这是有趣的一天。
我遇到了意外处理 shell 的 $pwd
和 $home
的问题。
我将一个下载 URL 和一个目标文件传递到我的程序中。我希望目标文件是相对路径,例如 download/temp.txt.gz
param($srcUrl, $destFile)
$client = new-object System.Net.WebClient
$client.DownloadFile($srcUrl, $destFile)
Ungzip-File $destFile
Remove-Item $destFile
这实际上在调用 Remove-Item
时失败了。如果 $destFile
是相对路径,那么脚本会愉快地下载文件并将其放入相对于 $home
的文件中。同样,然后我解压缩它,我的函数 Ungzip-File
使用 System.IO.Filestream
,它似乎找到了这个文件。然后 Remove-Item
提示相对于 $pwd
的路径中没有文件。
我有点困惑,因为可以这么说,这些都是 shell 的一部分。我不清楚为什么这些函数会以不同方式处理路径,更重要的是,我不确定如何解决这个问题,使相对路径和绝对路径都起作用。我试过查看 io.path
方法,但由于我的 $home
和 $pwd
在不同的驱动器上,我什至不能使用 IsPathRooted
,当我找到它时,它看起来很接近。
有什么帮助吗?
最佳答案
您必须清楚自己在路径中的位置。 $pwd 在命令 shell 上工作得很好,但假设您已经从计划的作业中启动了脚本。您可能认为 $pwd 是您的脚本所在的位置并相应地编写代码,但发现它实际上使用了 %windir%\system32。
一般来说,我会使用目标的完整路径,对于相对于脚本文件夹的路径,我会使用 $PSScriptRoot/folder_name/file_path。
那里也有收获。例如,我注意到 $PSScriptRoot 会在脚本中很好地解析,但不会在 Param() block 中解析。我强烈建议在编码和测试时使用 write-verbose,这样您就知道它认为路径是什么。
[CMDLETBINDING()] ## you need this!
Param()
write-verbose "path is $pwd"
Write-Verbose "removing $destFile"
Remove-Item $destfile
并在调用脚本/函数时添加 -verbose:
myscript.ps1 -verbose
mydownloadfunction -verbose
关于powershell - 在 powershell WebClient 和 FileStream 中使用相对路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21589594/