powershell - 在 powershell WebClient 和 FileStream 中使用相对路径

标签 powershell powershell-2.0

我的任务是编写一个 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/

相关文章:

PowerShell:如何强制以数组而不是对象的形式获取结果

powershell - 如何在PowerShell中使变量成为范围?

powershell - 如何使用 PowerShell 将 UTC 转换为 EST

windows - PowerShell:(ConvertTo-* | Set-Content) 和 (Export-*) 之间的区别?

powershell - 为什么使用 PowerShell 以外的其他工具进行解码时,PowerShell 生成的 base64 字符串中包含点

powershell-2.0 - 无法用 PowerShell 2.0 替换文件名

powershell - 使用 powershell 路径中存在非法字符

c# - powerShell.AddCommand 的使用

deployment - PowerShell 和 MSBuild 的区别

powershell - 如何将数组从操作系统传递到 PowerShell 脚本