Powershell通过批处理文件多个语句

时间:2015-04-15 12:47:33

标签: powershell batch-file psexec

此代码非常接近完成,但是我无法获取我希望运行的最后一个语句(psexec \\%PC% -i -d -s "\.exe),仅在设备ping时运行。

目标是,如果设备ping 然后写入主机,它ping并运行psexec命令 else 写入主机它还没有能够ping。

代码:

@ECHO OFF
cls
Clear-Host

set /p PC=PC no?:

FOR %%i IN (
    %PC%
) DO (
     PowerShell -NoProfile -Command "If (Test-Connection %%i -Count 1 -Quiet) { Write-Host "%%i - successfully pinged" -F Green } (psexec \\%PC% -i -d -s "\.exe that i wish to run") 
    else { Write-Host "%%i FAILED" -F Red}"
)

pause

1 个答案:

答案 0 :(得分:0)

这就像Spanglish或其他东西。 Clear-Host不是cmd理解的命令,只是ping更容易。

@echo off
setlocal

if "%~1"=="" (
    set /P "PC=PC no? "
) else (
    set "PC=%~1"
)

ping -n 1 %PC% | find /i "TTL=" >NUL 2>NUL && (
    powershell "Write-Host '%PC% passed' -f Green"
    psexec \\%PC% -i -d -s "\.exe that i wish to run"
) || (
    powershell "Write-Host '%PC% failed' -f Red"
)

对于它的价值,如果您不需要psexec运行的命令的输出,我通常会发现wmic process call createpsexec更快

wmic /node:%PC% process call create "exe that you wish to run"

如果您需要提供身份验证信息,请在/user:username之前添加/password:passwordprocess call create个切换。


上面的代码存在一些问题。在批处理脚本中执行PowerShell命令时,您不能轻易地破坏该行。您还应该在psexec代码块中包含if命令,而不是像现在一样包含它。如果需要,您可以使用分号与支持的代码块分隔命令。最后,您需要小心地将双引号作为powershell命令标记的一部分与命令中的双引号混合使用。它可以修复,以便powershell处理条件流,但我的解决方案同样适用,我认为更具可读性。