我的任务是编写一个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
我找到了。
任何帮助?
答案 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