当目标路径包含表情符号字符时,复制快捷方式文件(*.lnk)的目标

2024-02-06

我的目标是编写一个简单的 Powershell 脚本,该脚本将采用一个强制参数,该参数必须是快捷方式 (.lnk) 文件的完整文件路径,然后该脚本将解析快捷方式的目标项(文件或目录)并将其复制到脚本的当前工作目录中。

我发现的问题是在测试其目标项指向路径中包含表情符号的文件或文件夹的快捷方式时,例如:

"C:\Movies\• Unidentified\[????????]\Amor, curiosidad, prozak y dudas (2001)\File.mkv"

首先我尝试过复制项目cmdlet,之后我尝试使用 Windows Shell 脚本中的 Shell.NameSpace + Folder.CopyHere() 方法,如本示例所示:

https://stackoverflow.com/a/33760315/1248295 https://stackoverflow.com/a/33760315/1248295

我最终假装在这个脚本中使用了这种方法,而不是复制项目cmdlet,因为它显示默认的文件进度 UI,因此我更喜欢它。

请注意,我对 PowerShell 的经验不是很丰富,但在这两种情况下复制项目cmdlet 和 CopyHere 方法执行时不会给出任何异常消息,它只是不执行文件复制操作。

如果快捷方式的目标项目的项目路径不包含表情符号字符,则它可以正常工作。

我不确定这是否是某种编码问题。我的默认操作系统编码是 Windows-1252。

我做错了什么以及如何解决这个问题?

# Takes 1 mandatory argument pointing to a shortcut (.lnk) file, 
# resolves the shortcut's target item (a file or directory), 
# and copies that target item to the specified destination folder 
# using Windows default IFileOperation progress UI.

# - File copy method took from here:
#   https://stackoverflow.com/a/33760315/1248295

# - "Shell.NameSpace" method and "Folder" object Docs:
#   https://learn.microsoft.com/en-us/windows/win32/shell/shell-namespace
#   https://learn.microsoft.com/en-us/windows/win32/shell/folder

param (
    [Parameter(
        Position=0,
        Mandatory, 
        ValueFromPipeline, 
        HelpMessage="Enter the full path to a shortcut (.lnk) file.")
    ] [string] $linkFile = "",
    [Parameter(
        Position=1,
        ValueFromPipeline, 
        HelpMessage="Enter the full path to the destination folder.")
    ] [string] $destinationFolder = $(Get-Location)
)

$wsShell    = New-Object -ComObject WScript.Shell
$shellApp   = New-Object -ComObject Shell.Application
$targetItem = $wsShell.CreateShortcut($linkFile).TargetPath

Write-Host [i] Link File..: ($linkFile)
Write-Host [i] Target Item: ($targetItem)
Write-Host [i] Destination: ($destinationFolder)
Write-Host [i] Copying target item to destination folder...
$shellApp.NameSpace("$destinationFolder").CopyHere("$targetItem")
Write-Host [i] Copy operation completed.

#[System.Console]::WriteLine("Press any key to exit...")
#[System.Console]::ReadKey($true)
Exit(0)

UPDATE

我把所有这些都放在param块并且没有任何改变:

[Text.Encoding] $encoding                      = [Text.Encoding]::UTF8
[console]::InputEncoding                       = $encoding
[console]::OutputEncoding                      = $encoding
$OutputEncoding                                = $encoding
$PSDefaultParameterValues['Out-File:Encoding'] = $encoding
$PSDefaultParameterValues['*:Encoding']        = $encoding

正如评论中所讨论的,Shell.CreateShortcut当涉及表情符号时,该方法似乎存在编码问题(根本原因可能是缺少对表情符号的支持)UTF-16 代理对 https://learn.microsoft.com/en-us/globalization/encoding/surrogate-pairs)。变量的值$targetItem已经包含??代替表情符号字符。证据是,这不仅会显示在控制台中,而且如果您将值写入 UTF-8 编码文件也会显示。

作为解决方法,您可以使用FolderItem2.ExtendedProperty(String) https://learn.microsoft.com/en-us/dotnet/api/shell32.folderitem2.extendedproperty?view=powershellsdk-1.1.0方法。这允许您查询大量外壳属性 https://learn.microsoft.com/en-us/windows/win32/properties/props。我们感兴趣的是System.Link.TargetParsingPath https://learn.microsoft.com/en-us/windows/win32/properties/props-system-link-targetparsingpath.

Function Get-ShellProperty {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)]
        [Alias('FullName', 'PSPath')]
        [string[]] $LiteralPath,

        [Parameter(Mandatory)]
        [string[]] $Property
    )
    begin{
        $Shell = New-Object -ComObject Shell.Application
    }
    process{
        foreach( $filePath in $LiteralPath ) {
            $fsPath = Convert-Path -LiteralPath $filePath
            $nameSpace = $Shell.NameSpace(( Split-Path $fsPath ))       
            $file = $nameSpace.ParseName(( Split-Path $fsPath -Leaf ))

            # Query the given shell properties and output them as a new object
            $ht = [ordered] @{ Path = $filePath }
            foreach( $propId in $Property ) {
                $ht[ $propId ] = $file.ExtendedProperty( $propId )
            }
            [PSCustomObject] $ht
        }
    }
}

Usage:

$properties = Get-ShellProperty $linkFile -Property System.Link.TargetParsingPath
$targetItem = $properties.'System.Link.TargetParsingPath'

您还可以通过一次调用查询多个属性:

$properties = Get-ShellProperty $linkFile -Property System.Link.TargetParsingPath, System.Link.Arguments
$targetItem = $properties.'System.Link.TargetParsingPath'
$arguments  = $properties.'System.Link.Arguments'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当目标路径包含表情符号字符时,复制快捷方式文件(*.lnk)的目标 的相关文章

随机推荐

  • Python ImportError:没有名为 cv 的模块

    我刚刚接触 Python 并尝试在线运行脚本代码在这里 https github com abidrahmank OpenCV Python blob master Other Examples multi color two object
  • 类型不匹配:无法从对象转换为列表

    CompanyDAO companyDAO new CompanyDAO List companyList companyDAO getAllCompanyList MycompanyList 包含如下数据 1 Agastha Medica
  • 使用 truffle 测试以太坊事件日志

    我有一个合约的函数 它在每次调用时发出事件 我希望在每个通过的测试上发出一个事件 以下是一些测试 it should emit Error event when sending 5 ether function done var insur
  • 单击窗口时关闭画布外菜单

    我制作了这个 滑出 菜单 SASS 滑出式菜单 http codepen io Riccardo Zanutta pen wGjqt 没关系 但我希望当菜单滑动时 在窗口上单击菜单返回 删除 nav open 类 我在 codepen 演示
  • 整数还是字符?哪个更快? [复制]

    这个问题在这里已经有答案了 我的 C 程序在内存中存储许多整数值 并经常读取它们并对其进行比较 类型范围unsigned char足够了 但我已经用过int因为对我来说速度比内存消耗重要得多 我想也许 CPU 可以与int速度更快 但这只是
  • ASSEMBLY - 如何计算两个数字之间的总和(间隔)

    嘿伙计们你能帮忙吗 我不知道如何计算两个数字之间的和 例如 第一个数字 gt 1 第二个数字 gt 5 总和将 gt 1 2 3 4 5 15 我只计算了两个数字的总和 我不知道如何执行此数字序列 我的代码如下 谢谢 MAIN MOV AX
  • npm 命令 - 错误:EISDIR:对目录进行非法操作,读取

    在发出npm命令我收到一条错误消息 Error EISDIR illegal operation on a directory read TypeError Cannot read property get of undefined 我在这
  • 如何在 Swift 中放置数组的第一个和最后一个元素

    我有一本这样的字典 Price 00 00 200 00 200 00 400 00 600 00 800 00 现在我将所有字典值存储在数组中 如下所示 var priceRange String String if let obj cu
  • 让 Cordova 等待异步挂钩完成

    在我的 Cordova 项目中 我有一个钩子可以对 RequireJS 进行优化 r js after prepare 该优化本质上是异步的 因此我的挂钩代码在所有优化完全完成之前返回 例如 这会在运行时导致问题cordova run br
  • 8086汇编程序存储唯一值

    我一直在制作这个程序 它接受一个列表并在其中查找唯一元素并将其存储在另一个列表或寄存器中 下面的代码将主列表放入 SI 寄存器中 然后 BX 充当指针 遍历整个数组以查找相似之处 如果没有找到相似之处 则 SI 中的元素 存储在 AL 中
  • 从实时视频设备捕获图像以供基于 Java 的应用程序使用的最佳方法是什么?

    我正在研究某些场景的半实时检测的图像处理问题 我的目标是让实时视频以 Motion JPEG 帧的形式出现在我的 Java 代码中somehow 我熟悉Java媒体框架 http java sun com javase technologi
  • 基于网络的可视化查询生成器

    我正在寻找一个可视化查询生成器http ajax easyquerydemo com http ajax easyquerydemo com 我使用的是 ASP NET 但使用的是 MVC 所以宁愿使用不基于 WebForms 的东西 如链
  • Python 中位串的逻辑或

    我想要做的是获得两个位串的逻辑或的结果 例如 a 010010 b 000101 c LOGIC OR a b c 010111 我大多数时候遇到的错误是当我将 b 从字符串转换为二进制时 它会删除前导零 我使用的其他方法将 a 和 b 转
  • 有没有一种方法可以仅使用 PHP 获取 Google 地图中给定地址的经度/纬度?

    我知道这在 Javascript 中是可能的 但我需要仅使用 PHP 来做到这一点 我该怎么办 是的 有一个HTTP 地理编码接口 http code google com apis maps documentation geocoding
  • 如何将 _app.js 包装在多个提供者中?

    我想知道是否可能以及如何包装我的顶级页面 app js在 Redux 提供程序中 我已经将其包装为 Next auth 提供程序 例如 import React from react import Provider from next au
  • 通过jquery一起提交表单和变量

    我正在使用两种类型的提交 有 post post servers side php var1 var1 var2 var2 function result some code 它将单独的变量发送到服务器端脚本 还有 AjaxSubmit 插
  • Gui JList 动作监听器

    嘿大家晚上好 我对名为 提交 的第二个按钮有一个问题 因为我无法将我输入的所有信息传输到框架中的空 JList 这是我的代码 到目前为止我的问题是 如果我单击 提交 我的所有信息将显示在我的框架中的消息区域需要列出 谢谢 import ja
  • Windows 模拟和复制令牌

    我有一个 asp net 项目 其中请求将工作委托给后台 通过quartz net Web 应用程序使用 Windows 身份验证和模拟 我还想在后台线程上模拟当前用户 我已经阅读了如何使用提供的域名 用户名和密码来模拟用户并调用内核 这个
  • 构建具有项目共存频率的稀疏矩阵(用于分析产品的交叉销售)[重复]

    这个问题在这里已经有答案了 我坚持创建一个稀疏矩阵 在其中我可以根据购物车和产品 ID 来计算产品的交叉销售频率 示例数据框 x data frame cart id c 1 1 1 2 2 3 4 5 5 6 product id c A
  • 当目标路径包含表情符号字符时,复制快捷方式文件(*.lnk)的目标

    我的目标是编写一个简单的 Powershell 脚本 该脚本将采用一个强制参数 该参数必须是快捷方式 lnk 文件的完整文件路径 然后该脚本将解析快捷方式的目标项 文件或目录 并将其复制到脚本的当前工作目录中 我发现的问题是在测试其目标项指