【问题标题】:working with relative paths in powershell WebClient and FileStream在 powershell WebClient 和 FileStream 中使用相对路径
【发布时间】:2014-03-02 14:42:17
【问题描述】:

我的任务是编写一个 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 的路径中没有文件。

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

有什么帮助吗?

【问题讨论】:

    标签: powershell powershell-2.0


    【解决方案1】:

    您必须清楚自己在路径中的位置。 $pwd 在命令 shell 上工作得很好,但是假设您已经从计划的作业启动了脚本。您可能认为 $pwd 是您的脚本所在的位置并相应地进行编码,但发现它实际使用的是 %windir%\system32。

    一般来说,我会使用到目标的完整路径,而对于相对于脚本文件夹的路径,我会使用 $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
    

    【讨论】:

    • 不,这不是不知道自己在哪里的问题。我知道我在哪里 - 一些命令只是忽略它并选择根据您的脚本位置来解释相对路径。
    【解决方案2】:

    要使用相对路径,需要用./指定当前目录

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

    您还可以使用Set-Location(别名:cd)在脚本中间更改您的位置

    【讨论】:

    • 这是我尝试做的第一件事,认为它试图从根目录解析路径。问题是这些“microsoft”调用的相对路径不同。我希望这些方法使用 $home 或 $pwd,但不是“有时一个,有时另一个”。
    • 大部分时间它与脚本本身或脚本“开始”的位置有关
    猜你喜欢
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    相关资源
    最近更新 更多