Powershell 从变量输出中选择特定字符的最佳方法?

Powershell 从变量输出中选择特定字符的最佳方法?,powershell,Powershell,这里的输出是这样的 以名称为例“S002567.5050b3d7.mxf”并使输出为“S002567”,最聪明的方法是什么?所以要把所有的东西都刮走 托马斯,最好的管理者,我认为“最聪明”的方法应该是基于意见的,但一个简单的方法是简单地按时间分割,抓住第一个要素 $limit = (Get-Date).AddDays(-702) $path = "X:\" $files = Get-ChildItem -Path $path -Force | Where-Object {

这里的输出是这样的

以名称为例“S002567.5050b3d7.mxf”并使输出为“S002567”,最聪明的方法是什么?所以要把所有的东西都刮走

托马斯,最好的管理者,我认为“最聪明”的方法应该是基于意见的,但一个简单的方法是简单地按时间分割,抓住第一个要素

$limit = (Get-Date).AddDays(-702)
$path = "X:\"

$files = Get-ChildItem -Path $path -Force | Where-Object { !$_.PSIsContainer -and  $_.LastWriteTime -lt $limit }

$new = $files | Where-Object {$_.LastWriteTime.TimeOfDay -gt "18:14" -and $_.LastWriteTime.TimeOfDay -lt "18:30" }

$sorted = $new | Where-Object {$_.Name -notmatch "#"}
我认为“最聪明”的方法应该是基于观点的,但一个简单的方法是简单地根据时间分割并抓住第一个要素

$limit = (Get-Date).AddDays(-702)
$path = "X:\"

$files = Get-ChildItem -Path $path -Force | Where-Object { !$_.PSIsContainer -and  $_.LastWriteTime -lt $limit }

$new = $files | Where-Object {$_.LastWriteTime.TimeOfDay -gt "18:14" -and $_.LastWriteTime.TimeOfDay -lt "18:30" }

$sorted = $new | Where-Object {$_.Name -notmatch "#"}

通过管道将文件对象传输到每个对象的
ForEach
,然后操作每个对象的
Name
属性:

$Sorted | Foreach-Object {($_.Basename -split '\.')[0]}
-replace
运算符一起使用的正则表达式模式将查找并删除第一个
及其后的所有内容:

$sorted |ForEach-Object { $_.Name -replace '\..*$' }

通过管道将文件对象传输到每个对象的
ForEach
,然后操作每个对象的
Name
属性:

$Sorted | Foreach-Object {($_.Basename -split '\.')[0]}
-replace
运算符一起使用的正则表达式模式将查找并删除第一个
及其后的所有内容:

$sorted |ForEach-Object { $_.Name -replace '\..*$' }

使用PowerShell时,有两件事需要记住

  • PowerShell是面向对象的
  • PowerShell使用管道
  • 只要你能坚持这些规则,你就会有更多的选择,你的工作就会更容易

    您可以使用将信息添加到由
    Get ChildItem
    创建的对象中

    使用正则表达式获取文本

    您可以使用名称的前七个字符。
    • ^
      是字符串的开头:
      $this.Name在本例中为
      $此.Name相当于$\名称,并且是一个
    • 是任意字符
    • {7}
      总共抓取七个字符
    您可以匹配特定的模式。
    • ^
      是字符串的开头
    • S
      是大写字母“S”
    • \d
      是一个数字
    • {6}
      是六个数字

    其中Object TruncatedName
    将输出限制为仅与正则表达式匹配的名称。否则,无论是否接收到截断的名称,所有文件都将沿着管道传递

    可以使用静态日期而不是偏移量

    $limit = (Get-Date).AddDays(-702)
    $path = "X:\"
    
    Get-ChildItem -Path $path -Force -File | 
      Where-Object { ($_.LastWriteTime -lt $limit) -and 
                     ($_.LastWriteTime.TimeOfDay -gt "18:14") -and 
                     ($_.LastWriteTime.TimeOfDay -lt "18:30") -and 
                     ($_.Name -notmatch "#")
                   } | 
      Add-Member -MemberType ScriptProperty -Name "TruncatedName" -Value { $this.Name -match "^S\d{6}" | Out-Null; $matches[0] } -PassThru | 
      Where-Object TruncatedName | 
      Select-Object -Property Name, TruncatedName
    
    使用
    getchilditem-File
    而不是
    getchilditem | Where对象{$\ psicontainer-eq$false}

    管道中的每个cmdlet在处理完成后立即传递一个值。通过消除临时变量,我们可以更有效地处理数据

    以管道结尾的代码行将保留管道

    $limit = Get-Date "January 1, 2019" 
    $path = "X:\"
    
    Get-ChildItem -Path $path -Force -File | 
      Where-Object { ($_.LastWriteTime -lt $limit) -and 
                     ($_.LastWriteTime.TimeOfDay -gt "18:14") -and 
                     ($_.LastWriteTime.TimeOfDay -lt "18:30") -and 
                     ($_.Name -notmatch "#")
                   } | 
      Add-Member -MemberType ScriptProperty -Name "TruncatedName" -Value { $this.Name -match "^.{7}" | Out-Null; $matches[0] } -PassThru | 
      Where-Object TruncatedName | 
      ForEach-Object TruncatedName 
    
    空格被忽略。每当解析器看到缺少的信息时(比如一行末尾的
    -和
    ,或者未闭合的大括号
    {}
    ),它都会在下一行继续处理

    带括号的分组子句
    ()


    如果需要字符串而不是
    FileInfo
    对象,请使用
    | ForEach Object TruncatedName
    显式发出字符串

    # started with
    $files = Get-ChildItem -Path $path -Force | Where-Object { !$_.PSIsContainer -and  $_.LastWriteTime -lt $limit }
    $new = $files | Where-Object {$_.LastWriteTime.TimeOfDay -gt "18:14" -and $_.LastWriteTime.TimeOfDay -lt "18:30" }
    $sorted = $new | Where-Object {$_.Name -notmatch "#"}
    
    # using a single, readable pipeline
    Get-ChildItem -Path $path -Force -File | 
      Where-Object { ($_.LastWriteTime -lt $limit) -and 
                     ($_.LastWriteTime.TimeOfDay -gt "18:14") -and 
                     ($_.LastWriteTime.TimeOfDay -lt "18:30") -and 
                     ($_.Name -notmatch "#")
                   } 
    

    您可以将其他变量移出管道

    $limit = Get-Date "January 1, 2019" 
    $path = "X:\"
    
    Get-ChildItem -Path $path -Force -File | 
      Where-Object { ($_.LastWriteTime -lt $limit) -and 
                     ($_.LastWriteTime.TimeOfDay -gt "18:14") -and 
                     ($_.LastWriteTime.TimeOfDay -lt "18:30") -and 
                     ($_.Name -notmatch "#")
                   } | 
      Add-Member -MemberType ScriptProperty -Name "TruncatedName" -Value { $this.Name -match "^.{7}" | Out-Null; $matches[0] } -PassThru | 
      Where-Object TruncatedName | 
      ForEach-Object TruncatedName 
    

    参考资料


    使用PowerShell时,有两件事需要记住

  • PowerShell是面向对象的
  • PowerShell使用管道
  • 只要你能坚持这些规则,你就会有更多的选择,你的工作就会更容易

    您可以使用将信息添加到由
    Get ChildItem
    创建的对象中

    使用正则表达式获取文本

    您可以使用名称的前七个字符。
    • ^
      是字符串的开头:
      $this.Name在本例中为
      $此.Name相当于$\名称,并且是一个
    • 是任意字符
    • {7}
      总共抓取七个字符
    您可以匹配特定的模式。
    • ^
      是字符串的开头
    • S
      是大写字母“S”
    • \d
      是一个数字
    • {6}
      是六个数字

    其中Object TruncatedName
    将输出限制为仅与正则表达式匹配的名称。否则,无论是否接收到截断的名称,所有文件都将沿着管道传递

    可以使用静态日期而不是偏移量

    $limit = (Get-Date).AddDays(-702)
    $path = "X:\"
    
    Get-ChildItem -Path $path -Force -File | 
      Where-Object { ($_.LastWriteTime -lt $limit) -and 
                     ($_.LastWriteTime.TimeOfDay -gt "18:14") -and 
                     ($_.LastWriteTime.TimeOfDay -lt "18:30") -and 
                     ($_.Name -notmatch "#")
                   } | 
      Add-Member -MemberType ScriptProperty -Name "TruncatedName" -Value { $this.Name -match "^S\d{6}" | Out-Null; $matches[0] } -PassThru | 
      Where-Object TruncatedName | 
      Select-Object -Property Name, TruncatedName
    
    使用
    getchilditem-File
    而不是
    getchilditem | Where对象{$\ psicontainer-eq$false}

    管道中的每个cmdlet在处理完成后立即传递一个值。通过消除临时变量,我们可以更有效地处理数据

    以管道结尾的代码行将保留管道

    $limit = Get-Date "January 1, 2019" 
    $path = "X:\"
    
    Get-ChildItem -Path $path -Force -File | 
      Where-Object { ($_.LastWriteTime -lt $limit) -and 
                     ($_.LastWriteTime.TimeOfDay -gt "18:14") -and 
                     ($_.LastWriteTime.TimeOfDay -lt "18:30") -and 
                     ($_.Name -notmatch "#")
                   } | 
      Add-Member -MemberType ScriptProperty -Name "TruncatedName" -Value { $this.Name -match "^.{7}" | Out-Null; $matches[0] } -PassThru | 
      Where-Object TruncatedName | 
      ForEach-Object TruncatedName 
    
    空格被忽略。每当解析器看到缺少的信息时(比如一行末尾的
    -和
    ,或者未闭合的大括号
    {}
    ),它都会在下一行继续处理

    带括号的分组子句
    ()


    如果需要字符串而不是
    FileInfo
    对象,请使用
    | ForEach Object TruncatedName
    显式发出字符串

    # started with
    $files = Get-ChildItem -Path $path -Force | Where-Object { !$_.PSIsContainer -and  $_.LastWriteTime -lt $limit }
    $new = $files | Where-Object {$_.LastWriteTime.TimeOfDay -gt "18:14" -and $_.LastWriteTime.TimeOfDay -lt "18:30" }
    $sorted = $new | Where-Object {$_.Name -notmatch "#"}
    
    # using a single, readable pipeline
    Get-ChildItem -Path $path -Force -File | 
      Where-Object { ($_.LastWriteTime -lt $limit) -and 
                     ($_.LastWriteTime.TimeOfDay -gt "18:14") -and 
                     ($_.LastWriteTime.TimeOfDay -lt "18:30") -and 
                     ($_.Name -notmatch "#")
                   } 
    

    您可以将其他变量移出管道

    $limit = Get-Date "January 1, 2019" 
    $path = "X:\"
    
    Get-ChildItem -Path $path -Force -File | 
      Where-Object { ($_.LastWriteTime -lt $limit) -and 
                     ($_.LastWriteTime.TimeOfDay -gt "18:14") -and 
                     ($_.LastWriteTime.TimeOfDay -lt "18:30") -and 
                     ($_.Name -notmatch "#")
                   } | 
      Add-Member -MemberType ScriptProperty -Name "TruncatedName" -Value { $this.Name -match "^.{7}" | Out-Null; $matches[0] } -PassThru | 
      Where-Object TruncatedName | 
      ForEach-Object TruncatedName 
    

    参考资料