为每个带有子文件夹的文件夹运行PowerShell脚本

4

我有几个脚本需要针对十几个文件夹进行运行,这些文件夹都有相对路径。我正在尝试使用主脚本解决该问题,以便逐个文件夹在该路径下运行。这些文件夹都是以下路径中“here”文件夹的子文件夹。我似乎无法得到正确的语法,但我认为我接近了:)

是否有更有效的方法来针对目录中每个文件夹的内容逐个运行脚本?

$pdfFolder = 'C:\path\to\folders\here'
$Completed = Get-ChildItem $pdfFolder -Recurse

ForEach-Object ($Completed){
Invoke-Expression -Command "C:\path\where\scriptis\script.ps1"
}`
1个回答

5
$pdfFolder = 'C:\path\to\folders\here'

# Get all subfolders - note the -Directory switch (PSv3+)
$Completed = Get-ChildItem $pdfFolder -Recurse -Directory

# Pipe the subfolders to ForEach-Object, invoke the
# script with & (avoid Invoke-Expression), and pass the subfolder
# at hand as an argument.
$Completed | ForEach-Object {
  & "C:\path\where\scriptis\script.ps1" $_
}

关于你尝试的内容

Get-ChildItem $pdfFolder -Recurse

此命令返回的不仅是文件夹(目录),还包括文件。若要将输出限制为文件夹,请传递开关-Directory(PSv3+)。


ForEach-Object ($Completed) { ... }

您混淆了foreach循环的语法和基于管道的ForEach-Object cmdlet的语法。
该cmdlet期望从管道中接收输入,因此您必须使用
$Completed | ForEach-Object { ... }

另外请注意,除非您确实需要首先将所有子文件夹收集到数组中,否则可以直接将Get-ChildItem命令的输出导向ForEach-Object


Invoke-Expression -Command "C:\path\where\scriptis\script.ps1"

Invoke-Expression 应该避免使用,因为它很少是正确的工具,可能存在安全风险。

你只需要使用&,调用运算符,如上所示,通过引用和/或存储在变量中的文件路径来调用脚本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接