【问题标题】:removing file versions from the file从文件中删除文件版本
【发布时间】:2018-01-16 12:15:15
【问题描述】:

我正在尝试写下 powershell 脚本,如果它在文件中找到“标题”部分,它应该从文件夹游览中的所有文件中删除项目版本或语言版本“en”。

我的脚本仅对循环中标题为空的顶部文件名有效,但不适用于循环中标题也为空的其他文件。如何更改此脚本,以便它可以滚动循环并从标题为空的每个不同文件中删除语言版本?

$SN1 = Get-ItemProperty -Path "master:/content/www/home/company/tour/*"  -Name "Title" 

$SN2 = ''

$SN3 = 
 foreach ($SItem in $SN1.Title) {

     if ("$SItem" -eq $SN2)
     {
        Remove-ItemVersion  -Path "master:/content/www/home/company/tour/*" -Language "en"
     }

 }

【问题讨论】:

    标签: powershell powershell-2.0 powershell-3.0 powershell-4.0


    【解决方案1】:

    看起来您的基本语法技能可能需要一些额外的学习,因为出于某种原因,您在所测试的变量周围有引号并且错误地使用了标题的语法。

    所以首先,改变:

     if ("$SItem" -eq $SN2)
    

    收件人:

     if (!($SItem))
    

    那么,SN1 只是你写的标题,所以尝试 $SN1.title 根本行不通。另外,您查询的来源是什么?

    编辑:答案如下:

    既然您提供了对象类型,就很清楚了。这是代码,但您需要验证要删除的内容是正确的键/值:

    $SN1 = Get-ItemProperty -Path "master:/content/www/home/company/tour/*" -Name "Title"    
    if ($SN1.Title -eq '')
    {
        Remove-ItemVersion -Path "master:/content/www/home/company/tour/*" -Language "en"       
    }
    

    除非我遗漏了什么,否则基于 Get-Member $SN1 是一个单项,因此无需循环任何内容。如果某处有多个,我没有在您的代码中看到指示,因此您需要提供更多详细信息。该命令读取单个标题,如果为空,则删除其他内容。对于标题的集合,您需要提供他们的居住地等以获得更多帮助。

    【讨论】:

    • 正确,因为您的语法不正确。您能帮我粘贴以下命令的输出吗?: $SN1 = Get-ItemProperty -Path "master:/content/www/home/company/tour/*" -Name "Title" $SN1 | GM 对不起,这个站点的 cmets friggin wrap 是在你原来的第一行之上的 2 个命令来定义 $SN1,然后运行管道 $SN1 | 的第二个命令。获取会员
    • 您需要运行我要求通过管道将 $SN1 传递给 get-member 的命令,我需要查看返回的对象类型,然后我可以帮助您提供正确的代码。我可以告诉你的那些下面的发布代码是不正确的,因为他们也不知道返回的对象类型是什么,所以他们在猜测。运行:“$SN1 | Get-member”并发布输出
    【解决方案2】:

    我不确定您选择的路径,Get-ItemProperty 不能在其路径中使用 * 来选择路径中的每个项目。您必须先获取项目,然后将它们通过管道传输到 Get-ItemProperty。

    您需要创建一个包含每个项目及其属性的数组,然后循环遍历它们。

    $SN1 = Get-ChildItem -Path ""master:/content/www/home/company/tour" | Get-ItemProperty | select *
    

    然后循环遍历每个项目:

     $DebugPreference = 'Continue'
     foreach ($SItem in $SN1) 
     {
         Write-Debug -Message "Checking item $($SItem.Name) for a title."
         if(!($SItem.Title))
         {
            Write-Debug -Message "A title does not exist for this item $($SItem.FullName), removing the language property of its ItemVersion."
            Remove-ItemVersion -Path $SItem.FullName -Language "en"
         }
    
     }
    

    作为注释,如果您还想搜索子目录,则需要在 Get-ChildItem 上使用 -Recurse。

    【讨论】:

    • @user7986299 我更新了代码,有错误,应该是.FullName,而不是.FullPath。
    • 您必须将代码发布到 Remove-ItemVersion,这不是我熟悉的本机 Powershell 命令。它有可能期待与我们提供的路径不同的东西,或者需要额外的参数。此外,您应该添加调试消息以帮助了解您的代码在做什么。我在上面添加了示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2015-12-22
    相关资源
    最近更新 更多