如何修复批处理文件中的/ f循环以在目录中运行多个Powershell脚本

时间:2019-03-27 16:31:02

标签: powershell batch-file

我试图使以下命令运行位于指定目录中的多个powershell脚本文件:

@echo off
for /F %%f in ('dir /b "C:\ProgramData\MyScripts\"') do Powershell.exe -ExecutionPolicy Bypass -NoLogo -WindowStyle Hidden -File C:\ProgramData\Scripts\%%f
pause

它在命令行中工作正常,但是在批处理文件中不起作用(即使“%”已更改为“ %%”)。有什么想法可以使我工作吗?

2 个答案:

答案 0 :(得分:1)

以下是我建议您尝试的一种方法:

@If Exist "C:\ProgramData\MyScripts\*.ps1" For %%A In (
    "C:\ProgramData\MyScripts\*.ps1"
)Do @Powershell -NoP -NoL -Ex Bypass -W Hidden -F "C:\ProgramData\MyScripts\%%A"

我已进行过滤以确保仅解析.ps1个文件,以排除所有非PowerShell脚本无法运行。我还更改了要运行的文件的位置,因为似乎您正在解析一个目录C:\ProgramData\MyScripts中的文件,但试图在另一个目录C:\ProgramData\Scripts中运行它们。

还请注意,这不会运行目录中的每个文件,例如那些隐藏文件将不会被解析。为此,最好建议使用For /F循环并使用Dir命令选择文件:

@For /F Delims^=^ EOL^= %%A In ('
    Dir /B/A-D-L "C:\ProgramData\MyScripts\*.ps1" 2^>Nul
')Do @Powershell -NoP -NoL -Ex Bypass -W Hidden -F "C:\ProgramData\MyScripts\%%A"

请考虑到每个脚本将在上一个脚本结束之后运行,如果您希望在开始上一个脚本之后立即运行每个脚本,建议您打开“命令提示符”窗口并查看帮助信息Start /?的输出,以实现此目的。

答案 1 :(得分:1)

我建议您重组您的方法,以避免重复脚本的目录路径-这很可能是问题的根源

PowerShell 进行文件枚举

@echo off
powershell -ExecutionPolicy Bypass -WindowStyle Hidden -Command ^
  "dir C:\ProgramData\MyScripts\*.ps1 | foreach { & $_ }"
pause

请注意,为了提交整个PowerShell命令,必须从-File切换到-Command;这样就不需要-NoLogo

还可以考虑添加-NoProfile来禁止加载个人资料文件。

对于PowerShell命令:

  • dir用于简洁起见,但请注意,它是别名,即Get-ChildItem命令的作用。
  • foreachForEach-Object cmdlet的别名,它为每个输入对象(文件)运行关联的脚本块({ ... }),反映在自动变量$_中。
  • &是调用运算符,调用存储在变量中的命令(名称或路径)是必需的。

如果您希望坚持使用原始方法并要解决此问题,请参见Compo's helpful answer