缘由:要批量处理ncm文件,cmd的for好难记,不小心打开了ps

首先,我们要打开powershell。在键盘上按下Windows+X组合键,就可以看见Windows Powershell选项了。点击它。

但我不是这样干的,Windows Terminal比 ps 的原生界面漂亮多了。

ps原生
Terminal

首先,我们要获取文件列表。经过bing一下后,发现需要用到名为 Get-ChildItem 的cmdlet。那么,我们来man一下他,看看他怎么用。

PS C:\Users\DT9025A> man Get-ChildItem
名称
Get-ChildItem
语法
Get-ChildItem [[-Path] <string>]] [[-Filter] <string>]] [<CommonParameters>]
Get-ChildItem [[-Filter] <string>] [<CommonParameters>]
别名
gci
ls
dir

就很清楚,为了测验,我们先用 Get-ChildItem [[-Path] <string>] [[-Filter] <string>]模式来试一下能否正常获取文件列表。

# 获取文件集合
Get-ChildItem D:\CloudMusic *.mp3
好耶,成功力!

感觉很棒!那么接下来我们就可以进行遍历测试了!

继续使用万能的bing,了解到PowerShell中有foreach关键字,用法就像C#内的foreach一样 foreach([Var] in [Set]) (cmdlet和别名混用,别学我)这样,就来测试一下自己的举一反三力吧。

# 测试foreach
# 获取文件集合
$files = Get-ChildItem D:\CloudMusic *.mp3
# 计数变量
$count = 0
# 遍历集合
foreach ($singleFile in $files) {
    # 输出计数和文件名
    echo $count $singleFile.Name
    $count++
}

很棒,这样foreach就可以用了。看起来离成功已经很近了呢。

继续万能的bing,查到了运行程序可以用 Start-Process 进行。PowerShell给出的man信息如下:

PS C:\Users\DT9025A> man Start-Process
名称
Start-Process
语法
Start-Process [-FilePath] <string> [[-ArgumentList] <string>] [<CommonParameters>]
Start-Process [-FilePath] <string> [[-ArgumentList] <string[]>] [<CommonParameters>]
别名
saps
start

于是理所当然的写出了下列代码:

# 测试运行
# 获取文件集合
$files = Get-ChildItem D:\CloudMusic *.ncm
# 定义可执行文件路径
$exeDir = "D:\...\main.exe"
# 遍历集合
foreach ($singleFile in $files) {
    # 执行程序
    Start-Process -FilePath $exeDir -ArgumentList $singleFile.FullName -NoNewWindow -Wait
}

但是,问题他出现了!目标程序提示无效的路径!

此时,往上翻翻,发现文件名中间有空格… 这样的话,就需要在绝对路径前后加上引号来指示这是单个参数了。那么,就去查查字符串如何拼接吧!

结果震撼我整年,竟然可以用 “+” 直接进行连接,PowerShell真是太厉害啦!

除了 “+” 操作符,还可以使用 -Join(string1, string2...) 进行连接。

# 测试字符串连接
# 定义两个字符串
$s = "te"
$s2 = "st"
# 使用 + 操作符
$s + $s2
# 使用 -Join(...)
-Join($s, $s2)

感觉很棒!那么,引号怎么表示呢?

答:”””” 在字符串内两个双引号可以转义为单个双引号。

# 测试引号
# 定义字符串
$s = """te"""
# 输出字符串
$s

让我们把这些元素合到一起!

# 测试运行
# 获取文件集合
$files = Get-ChildItem D:\CloudMusic *.ncm
# 定义可执行文件路径
$exeDir = "D:\...\main.exe"
# 遍历集合
foreach ($singleFile in $files) {
    # 拼接合法路径
    $fileDir = -Join("""", $singleFile.FullName, """")
    # 执行程序
    Start-Process -FilePath $exeDir -ArgumentList $fileDir -NoNewWindow -Wait
}