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路径不采用字符串变量的主要内容,如果未能解决你的问题,请参考以下文章