Powershell路径不采用字符串变量

Posted

技术标签:

【中文标题】Powershell路径不采用字符串变量【英文标题】:Powershell path not taking string variable 【发布时间】:2013-01-07 09:46:39 【问题描述】:

我正在使用以下代码通过 Windows 窗体的“浏览”功能选择一个文件夹,然后将该路径传递给 gci cmdlet

cls

Function Get-Directory($initialDirectory)
   
 [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") |
 Out-Null

 $OpenfolderDialog = New-Object System.Windows.Forms.FolderBrowserDialog
 $OpenfolderDialog.RootFolder = $initialDirectory
 $OpenfolderDialog.ShowDialog()| Out-Null
 $StartDir = $OpenfolderDialog.SelectedPath 
 Return $StartDir | Out-String
  

 $myDir = Get-Directory -initialDirectory "Desktop"

 $Child = gci -path $mydir -r -Filter *.jpg 

 Foreach ($item in $Child) Move-Item -path $item.pspath -Destination $myDir -Force

但我收到以下错误:

***在 C:\Test\Combine Pics2.ps1:17 char:13 + $Child = gci

Move-Item:无法将参数绑定到参数“路径”,因为它为空。 在 C:\Test\Combine Pics2.ps1:19 char:43 + Foreach($Child 中的 $item)Move-Item -path

$myDir变量是String类型,为什么不传给-path参数。

【问题讨论】:

它是字符串类型,但它实际上是什么?你有没有输出它以确保它是正确的? 你试过用调试器运行它吗,比如 powershell_ise 【参考方案1】:

如果用户取消了对话框怎么办?试试这个:

Function Get-Directory($initialDirectory)
   
     [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null

     $OpenfolderDialog = New-Object System.Windows.Forms.FolderBrowserDialog
     $OpenfolderDialog.RootFolder = $initialDirectory
     $result = $OpenfolderDialog.ShowDialog()

     if($result -eq 'ok')
     
         $OpenfolderDialog.SelectedPath
     
     else
     
        "canceled"
     
  


$mydir = Get-Directory -initialDirectory Desktop

if($mydir -ne 'canceled')

    gci -path $mydir

【讨论】:

【参考方案2】:

试试这个:

Function Get-Directory($initialDirectory)
   
    [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null

    $OpenfolderDialog = New-Object System.Windows.Forms.FolderBrowserDialog
    $OpenfolderDialog.RootFolder = $initialDirectory
    if ($OpenfolderDialog.ShowDialog() -eq "OK") 
        #Continue only if a folder was selected
        $OpenfolderDialog.SelectedPath
    
 

$myDir = Get-Directory -initialDirectory "Desktop"

#Continue only if a folder was selected
if($myDir) 
    $Child = Get-ChildItem -path $mydir -Recurse -Filter *.jpg
    Foreach ($item in $Child) 
        Move-Item -path $item.pspath -Destination $myDir -Force
    

我用一些 if 测试对其进行了清理,因此当人们取消对话框时它不会返回错误。不需要Out-String,因为SelectedPath 本身会返回一个字符串。

【讨论】:

【参考方案3】:

我在 $mydir 值的末尾有一个换行符和回车符,所以请尝试使用类似这样的内容进行修剪,看看这是否是您的问题:

$Child = gci -path $mydir.Trim("`r`n") -r -Filter *.jpg

更新:更好的是,只需在你的函数中丢失Out-String

Return $StartDir

【讨论】:

我输出了测试的类型,我只是得到一个对象而不是字符串。这就是我使用 Out-string 的原因。我会尝试修剪,看看会发生什么。

以上是关于Powershell路径不采用字符串变量的主要内容,如果未能解决你的问题,请参考以下文章

Powershell - 文件名中的变量时不支持路径格式

如何使用Windows Power Shell

(12)Powershell中变量的类型

Powershell:在 PowerShell 中重新加载路径

power shell 远程连接

如何通过输入包含文件路径的变量在powershell中打开文件?