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

在powershell WebClient和FileStream中使用相对路径,powershell,powershell-2.0,Powershell,Powershell 2.0,我的任务是编写一个powershell脚本来执行文件下载,文件下载最终将作为计划任务每周执行一次。我没有在windows环境下编程的背景,所以这是一个有趣的一天 我遇到了意外处理shell的$pwd和$home的问题 我将下载URL和目标文件传递到我的程序中。我希望目标文件是一个相对路径,例如,download/temp.txt.gz param($srcUrl, $destFile) $client = new-object System.Net.WebClient $client.Down

我的任务是编写一个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
在调用
删除项时,这实际上失败了。如果
$destFile
是一个相对路径,那么脚本将愉快地下载该文件,并将其放入相对于
$home
的文件中。同样地,我然后解压缩这个文件,我的函数
Ungzip File
使用
System.IO.Filestream
,它似乎找到了这个文件。然后,
Remove Item
抱怨相对于
$pwd
的路径中没有文件

我有点困惑,因为可以说这些都是外壳的一部分。我不清楚为什么这些函数会以不同的方式处理路径,更重要的是,我不知道如何解决这个问题,使相对路径和绝对路径都能工作。我试过查看
io.path
方法,但是由于我的
$home
$pwd
在不同的驱动器上,我甚至不能使用
IsPathRooted
,当我找到它时,它似乎离我很近


有什么帮助吗?

要使用相对路径,需要使用
/

示例:
/download/temp.txt.gz

param($srcUrl, $destFile)

$client = new-object System.Net.WebClient
$client.DownloadFile($srcUrl, $destFile)

Ungzip-File $destFile

Remove-Item $destFile

你也可以在脚本中间改变你的位置,用“代码>设置位置<代码>(别名:代码> CD <代码>)

你必须知道你在路径中的位置。pwd在命令shell上运行得很好,但是假设您已经从计划的作业开始了脚本。您可能会认为$pwd是脚本所在的位置,并相应地编写代码,但会发现它实际使用了%windir%\system32

通常,我将使用目标的完整路径,对于相对于脚本文件夹的路径,我将使用$PSScriptRoot/folder\u name/file\u path

那里也有渔获物。例如,我注意到$PSScriptRoot在脚本中解析得很好,但在Param()块中解析得不好。我强烈建议在编码和测试时使用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

这是我尝试做的第一件事之一,我认为这是试图从根本上解决路径问题。问题是这些“microsoft”调用的相对路径不同。我希望这些方法使用$home或$pwd,但不是“有时一个,有时另一个”。大多数情况下,它是相对于脚本本身或脚本“开始于”的位置。不,这不是不知道您在哪里的问题。我知道我在哪里——有些命令只是忽略它,而是选择基于脚本的位置来解释相对路径。