【问题标题】:Powershell path not taking string variablePowershell路径不采用字符串变量
【发布时间】: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

标签: powershell path get-childitem


【解决方案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 的原因。我会尝试修剪,看看会发生什么。
      猜你喜欢
      • 2013-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 2017-10-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      相关资源
      最近更新 更多