我试图使以下命令运行位于指定目录中的多个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
它在命令行中工作正常,但是在批处理文件中不起作用(即使“%”已更改为“ %%”)。有什么想法可以使我工作吗?
答案 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
命令的作用。foreach
是ForEach-Object
cmdlet的别名,它为每个输入对象(文件)运行关联的脚本块({ ... }
),反映在自动变量$_
中。&
是调用运算符,调用存储在变量中的命令(名称或路径)是必需的。如果您希望坚持使用原始方法并要解决此问题,请参见Compo's helpful answer。