附加subdir时,Powershell函数返回双路径

时间:2014-03-22 08:58:41

标签: function powershell subdirectory

我有一个奇怪的问题。我有一个函数,需要$ srcDir和$ destDir以及$ topDir $ srcDir的格式为\ $ topDir \ subDir1 \ subDir2 \ subDir..n 我需要的是将所有subDir部分附加到$ destDir

到目前为止,我的方法是拆分路径,直到达到$ topDir,然后使用join-path将结果字符串附加到$ destDir。

如果没有子目录附加到$ destPath,那么返回是完美的。

如果我将路径附加到$ destPath,则返回$ destPath $ destPath

以下是样本值中的输出

  • srcIn:C:\ path \ topdir \
  • destIn:\\ server \ path \
  • destOut:\\ server \ path \

现在,如果我有子目录

  • scrIn:C:\ path \ topdir \ subpath \ subpath1
  • destIn:\ server \ path \
  • destOut:\\ server \ path \ subpath \ subpath1 \\ server \ path \ subpath \ subpath1

在函数内部,路径看起来是正确的。 destOut值没有dbl。一旦我从函数返回它有双值。

如何防止这种情况?我只是想要一个简单的函数来获取子目录并附加到destDir,这样我就可以保留文件夹结构并将文件移动到相应的目录中。

泰。

function GetSubDir
{
    param(
        [Parameter(Mandatory=$true)]
        [string]$filePath, 
        [Parameter(Mandatory=$true)]
        [string]$destDir,
        [string]$topDir="Disk1"
    )


    $tmpPath = Split-Path $filePath -parent
    $fileName = Split-Path $filePath -leaf 
    $tmp= Split-Path $filePath -leaf
    while ($tmp -ne $topDir)
    {

        if (test-path $tmpPath -PathType container)
        {
            if ($subDir){$subDir = "$tmp\$subDir"}
            else {$subDir = "$tmp\"}
        }
        else {$subDir = "$tmp"}
        $tmp = Split-Path $tmpPath -leaf
        $tmpPath = Split-Path $tmpPath -parent

    }

    $destPath = Join-Path $destDir $subDir
    if (!(Test-Path $destPath)) {md $destPath}
    if (Test-Path $destPath -PathType container) 

    #name is set in calling function
    {$destPath = Join-Path $destPath $name}

    return $destPath
}

2 个答案:

答案 0 :(得分:5)

md函数(new-item的别名)返回它创建的目录。由于您不对该值执行任何操作,因此会将其添加到函数的输出流中。

要解决此问题,请执行以下操作之一:

md $destPath | out-null

[null]md $destPath

答案 1 :(得分:1)

请大家知道@TessellatingHecker,请允许我同意一行就足够了,但我相信这一行是必需的:

$srcPath -replace [Regex]::Escape($topDir), $destDir

现在让我们将其封装在一个函数中......

function MapSubDir($srcPath, $topDir, $destDir)
{
    $srcPath -replace [Regex]::Escape($topDir), $destDir
}

然后将原始的两个测试用例喂给你,观察你得到了想要的结果:

PS> $srcPath= "C:\path\topdir\"
PS> $topDir= "C:\path\topdir\"
PS> $destDir= "\\server\path\"
PS> MapSubDir $srcPath $topDir $destDir
\\server\path

PS> $srcPath = "C:\path\topdir\subpath\subpath1"
PS> MapSubDir $srcPath $topDir $destDir
\\server\path\subpath\subpath1