小编mkl*_*nt0的帖子

Powershell:所有新对象都不是平等的?

我正在研究一些简短的演示脚本,以便在powershell上进行演示,当然我的一个简单的演示让我感到困惑.此演示的目的是显示在PowerShell中创建对象的不同方法.这是我的代码:

$file = ls 'C:\temp' | Where-Object {$_.Extension -eq '.txt'}
$file.FullName
$path = 'C:\temp\jdh.txt'
$newfile = New-Object -TypeName System.IO.FileInfo -ArgumentList $path
$newfile.FullName

$file.GetType()
$newfile.GetType()
$file
$newfile

$file | Get-Content | out-null
$newfile | Get-Content | out-null
Run Code Online (Sandbox Code Playgroud)

简单吧?通过不同的方法创建两个FileInfo对象并读取它们.输出显示文件相同:

C:\temp\jdh.txt
C:\temp\jdh.txt

IsPublic IsSerial Name                                     BaseType                                                                               
-------- -------- ----                                     --------                                                                               
True     True     FileInfo                                 System.IO.FileSystemInfo                                                               
True     True     FileInfo                                 System.IO.FileSystemInfo                                                               

LastWriteTime : 4/10/2013 3:38:29 PM
Length        : 46046
Name          : jdh.txt


LastWriteTime : 4/10/2013 3:38:29 PM
Length        : 46046
Name          : jdh.txt
Run Code Online (Sandbox Code Playgroud)

但是,当Get-Content尝试读取$ newfile对象时,我收到以下错误:

Get-Content …
Run Code Online (Sandbox Code Playgroud)

powershell

5
推荐指数
1
解决办法
1977
查看次数

对于文件路径,Bash字符串将""替换为"\" - 变量扩展

我知道有更好的方法可以做到这一点.

  1. 有什么更好的方法?

  2. 你如何在bash中对字符串变量进行字符串替换?

例如:(使用php因为这就是我所知道的)

$path = "path/to/directory/foo bar";

$path = str_replace(" ", "\ ", "$path");

echo $path;
Run Code Online (Sandbox Code Playgroud)

收益:

path/to/directory/foo\ bar
Run Code Online (Sandbox Code Playgroud)

bash replace expansion

5
推荐指数
1
解决办法
4412
查看次数

sed:删除文件前n个字符中的十六进制字符

我有一个模式:

201404018^@133^@^@1^@^2^@31@1^@^32
20140401^@8133^@3^@0^@^22@1^@^3
201404^@018133^@10^@3^@^4@12^@^321
20140401813322^@97^@^@5^@^23
Run Code Online (Sandbox Code Playgroud)

^@在上面代表NUL字符(0x00),我想在前14个字符(日期时间)内删除它们,但保留其余部分.就像:

20140401813312^@31@1^@^32
20140401813330^@^22@1^@^3
20140401813310^@3^@^4@12^@^321
20140401813322^@97^@^@5^@^23
Run Code Online (Sandbox Code Playgroud)

我试过了sed 's/^[0-9]{0,13}\x00//g'- 但那不会真的有用.

提前致谢!

regex bash sed

5
推荐指数
1
解决办法
1084
查看次数

获取内容并显示控制字符,例如`r - 可视化字符串中的控制字符

我们可以传递什么标志Get-Content来显示控制字符,如\r\n\n

我想要做的是确定文件的行结尾是Unix还是Dos风格.我试过简单的运行Get-Content,没有显示任何行结束.我也尝试过使用Vim set list,它只显示$了行结尾的内容.

我想用PowerShell做这件事,因为那将是非常有用的.

powershell diagnostics control-characters

5
推荐指数
2
解决办法
6704
查看次数

在PowerShell中调用动态变量

我正在尝试创建一个新变量,它将使用动态名称的其他变量作为其值.这是我想要做的:

我有一个带有两个值的System.Array:

$Years = 2015, 2016
Run Code Online (Sandbox Code Playgroud)

另一个变量$ Transactions包含各种事务的列表.

我试图通过以下方式使用每个$ Years值:

ForEach($Year in $Years){

New-Variable -Name "Transactions_$Year" -Value $Transactions | Where {$_.Date -like "*.$Year"
Run Code Online (Sandbox Code Playgroud)

现在我想做的事情(在同一个ForEach循环中)是在我创建另一个新变量时使用$ Transactions_ $ Year值,如下所示:

New-Variable -Name "Income_$Year" -Value $Transactions_$Year |  Where {$_.Amount -NotLike "-*"} | Measure-Object Amount -Sum | Select -ExpandProperty Sum

}
Run Code Online (Sandbox Code Playgroud)

这可能吗,或者您有什么其他方法可以实现这一目标吗?

powershell indirection dynamic-variables

5
推荐指数
1
解决办法
5087
查看次数

powershell的并行foreach最多使用5个线程吗?

参数throttlelimit可以foreach -parallel控制执行脚本时使用多少个进程。但即使我设置的进程数大于 5,我也不能拥有throttlelimit超过 5 个进程。

该脚本在多个 powershell 进程中执行。所以我检查脚本内的PID。然后对 PID 进行分组,以便我可以知道有多少个进程用于执行该脚本。

function GetPID() {
    $PID
}

workflow TestWorkflow {
    param($throttlelimit)
    foreach -parallel -throttlelimit $throttlelimit ($i in 1..100) {
        GetPID
    }
}

foreach ($i in 1..8) {
    $pids = TestWorkflow -throttlelimit $i
    $measure = $pids | group | Measure-Object
    $measure.Count
}
Run Code Online (Sandbox Code Playgroud)

输出是

1
2
3
4
5
5
5
5
Run Code Online (Sandbox Code Playgroud)

对于$i小于或等于5,我有$i流程。但对于$i超过 5 个进程,我只有 5 个进程。有什么办法可以增加执行脚本时的进程数吗?

编辑:为了回应@SomeShinyObject的答案,我添加了另一个测试用例。这是@SomeShinyObject 给出的示例的修改。我添加了一个函数S,它除了休眠 10 …

powershell parallel.for powershell-workflow

5
推荐指数
1
解决办法
4504
查看次数

在PowerShell中创建成对的字符串值的列表

对于我正在做的项目,我需要检查并查看文件中的一行中是否存在一对字符串。

我试图使用像这样的哈希表:

$makes = 'Ferrari', 'Ford', 'VW', 'Peugeot', 'Subaru'
$models = 'Enzo', 'Focus', 'Golf', '206', 'Impreza'

$table = @{}

for ($i = 0; $i -lt $makes.Length; $i++)
{
    $table.Add($makes[$i], $models[$i])
}
Run Code Online (Sandbox Code Playgroud)

在我尝试插入重复的品牌之前,此方法效果很好。我很快发现哈希表不接受重复项。

那么有没有办法在PowerShell中创建字符串的双重列表?在C#中非常容易做到,但是我发现在PowerShell中无法实现。

powershell hashtable list

5
推荐指数
2
解决办法
2005
查看次数

Powershell 中的行延续中间字符串

我正在尝试在具有两个相同捕获卡的系统上编写 FFmpeg 命令,因此我必须使用它们的“备用名称”,否则 FFmpeg 无法理解我正在调用哪一个。

唯一的问题是备用名称非常长,尤其是通过 dshow 调用音频和视频时:

-i video="@device_pnp_\\?\usb#vid_07ca&pid_0570&mi_00#7&3886ab1a&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global":audio="@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{0E6F0DEF-2B29-4117-8D30-13F01160AC5B}"
Run Code Online (Sandbox Code Playgroud)

我想在调用音频之前打破这个“字符串”中线,以使其更具可读性,如下所示:

-i video="@device_pnp_\\?\usb#vid_07ca&pid_0570&mi_00#7&3886ab1a&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global"`
:audio="@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{0E6F0DEF-2B29-4117-8D30-13F01160AC5B}"
Run Code Online (Sandbox Code Playgroud)

然而,反引号在这种情况下似乎不起作用,我猜是因为它与角色接壤?如果 I 和反引号前有一个空格,则会破坏字符串并且 FFmpeg 会出错:

    -i video="@device_pnp_\\?\usb#vid_07ca&pid_0570&mi_00#7&3886ab1a&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global" `
:audio="@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{0E6F0DEF-2B29-4117-8D30-13F01160AC5B}"
Run Code Online (Sandbox Code Playgroud)

有没有办法在 Powershell 中将其拆分为多行?

编辑 - 全功能命令:

ffmpeg -y -hide_banner -thread_queue_size 9999 -indexmem 9999 -guess_layout_max 0 -f dshow -rtbufsize 2147.48M `
-video_size 1920x1080 -framerate 60 `
-i video="@device_pnp_\\?\usb#vid_07ca&pid_0570&mi_00#7&3886ab1a&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global":audio="@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{0E6F0DEF-2B29-4117-8D30-13F01160AC5B}" `
-thread_queue_size 9999 -indexmem 9999 -guess_layout_max 0 -f dshow -rtbufsize 2147.48M `
-video_size 1920x1080 -framerate 60 `
-i video="@device_pnp_\\?\usb#vid_07ca&pid_0570&mi_00#7&24df76f&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global":audio="@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{0A494693-5F33-4304-88D7-394757E09648}" `
-map 0:0,0:1 -map 0:1 -map 1:0,1:1 -map 1:1 -c:v h264_nvenc …
Run Code Online (Sandbox Code Playgroud)

syntax powershell readability line-continuation

5
推荐指数
1
解决办法
4007
查看次数

PowerShell管道参数绑定顺序

我有一个高级函数,可以接受两种管道数据:

  • PSTypeName 为“MyType”的自定义对象
  • 任何具有 ID 属性的对象

这是我的功能:

function Test-PowerShell {
    [CmdletBinding(DefaultParameterSetName = "ID")]
    param (
        [Parameter(
            Mandatory = $true,
            ParameterSetName = "InputObject",
            ValueFromPipeline = $true
        )]
        [PSTypeName('MyType')]
        $InputObject,

        [Parameter(
            Mandatory = $true,
            ParameterSetName = 'ID',
            ValueFromPipelineByPropertyName = $true
            )]
        [int]
        $ID
    )

    process {
        if ($InputObject) {
            $objects = $InputObject
            Write-Verbose 'InputObject binding'
        }
        else {
            $objects = Get-MyType -ID $ID
            Write-Verbose 'ID binding'
        }

        # Do something with $objects
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以这样使用这个函数:

$obj = [PSCustomObject]@{
    PSTypeName = 'MyType'
    ID …
Run Code Online (Sandbox Code Playgroud)

parameters powershell typing

5
推荐指数
1
解决办法
589
查看次数

在 Powershell 中列出给定深度或以下的文件夹

我有一个包含很多文件夹的目录。我想列出所有深度超过 2 层的文件夹(路径)。因此,在下面的情况下文件夹 1 和 2。

Directory/folder1
Directory/folder1/test1/test/testsub
Directory/folder1/test2
Directory/folder1/test3
Directory/folder2/blablabla/bla/1
Directory/folder3/test
Directory/folder4/test
Directory/folder5/test
Run Code Online (Sandbox Code Playgroud)

我正在尝试以下操作:

$Depth = 3
$Path = "."

$Levels = "\*" * $Depth
$Folder = Get-Item $Path
$FolderFullName = $Folder.FullName
Resolve-Path $FolderFullName$Levels | Get-Item | ? {$_.PsIsContainer} | Write-Host
Run Code Online (Sandbox Code Playgroud)

powershell recursion directory-structure depth

5
推荐指数
1
解决办法
1万
查看次数