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

时间:2014-02-05 22:08:48

标签: powershell powershell-v2.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我找到了。

任何帮助?

2 个答案:

答案 0 :(得分:1)

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

指定当前目录

示例:./download/temp.txt.gz

您还可以使用Set-Location(别名:cd

在脚本中间更改您的位置

答案 1 :(得分:1)

你必须要知道你在路上的位置。 $ pwd在命令shell上运行得很好,但是假设你已经从预定的作业启动了你的脚本。您可能认为$ pwd是您的脚本所在的位置并相应地编码,但发现它实际上使用了,例如%windir%\ system32。

一般情况下,我会使用fullpath到目的地,对于相对于脚本文件夹的路径,我会使用$ PSScriptRoot / folder_name / file_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