我对使用命令提示符编程相关目的有点新,所以如果这没有意义或者似乎不清楚,请请求我详细说明,我将尽我所能。
我希望能够做的是在我的Windows机器上运行两个命令提示窗口(运行Windows 7)并让它们相互通信。例如,我希望Cmd窗口A告诉Cmd窗口B打印文件的内容,反之亦然。
这有可能吗?此外,我知道可能有一种方法可以通过在一个命令提示符窗口中轮询一个文件来实现这一点,但是如果可能的话,我希望采用异步/非阻塞方式执行此操作。
提前致谢!
答案 0 :(得分:1)
我发现让两个命令窗口相互交互非常简单。
批处理文件1:
:keepsending
set /p message=
Echo set run=%message% >command.bat
goto :keepsending
批处理文件2:
:running
%run%
set ran=%run%
:check
if not "%ran%"=="%run%" goto :running
call command.bat
timeout 1 >nul
goto :check
在其上添加一个计数器,我猜你可以让它在一个相互作用的更长的代码中工作。
如果您希望它在您的网络上运行,请使用poshd / popd
答案 1 :(得分:0)
2 cmd窗口的唯一交互方式是从批处理文件中调用另一个窗口。您可以将变量从一个传递到另一个。
E.g。您可以在一个批处理中设置变量,然后从第一个调用第二个变量作为输入参数传递变量。 这是一个示例,我首先确定用户用户的SID值,然后将其传递给脚本以运行它以远程修补计算机。
@echo off
setlocal
echo.
:entercname
set /p cname=Please enter computer name or IP address:
if not defined cname goto entercname
echo.
FOR /F %%a IN ('psgetsid \\%cname% %uname% /accepteula') DO set sid=%%a
echo %uname%'s SID is %sid%
echo.
start /wait cmd /c c:\temp\run_lync_fix.bat %sid%
我在第二批中从第一批运行的内容是:
@echo off
set sid=%1
echo SID is %sid%
REG ADD HKU\%sid%\Software\Policies\Microsoft\Communicator /v GalDownloadInitialDelay /t REG_DWORD /d 0 /f
REG ADD HKU\%sid%\Software\Policies\Microsoft\Office\15.0\Lync /v GalDownloadInitialDelay /t REG_DWORD /d 0 /f
REG ADD HKLM\Software\Policies\Microsoft\Communicator /v GalDownloadInitialDelay /t REG_DWORD /d 0 /f
IF %ERRORLEVEL% EQU 0 (echo Registry patched.) ELSE (Echo Error. Registry not patched.)
ping -n 5 localhost > nul
所以我从第一批传递%sid%,第二批通过set sid =%1接受它。
第二个提示是将一些变量存储在一个批处理中的temp或txt文件中,并从另一个批处理中读取它。
@echo off
Setlocal EnableDelayedExpansion
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render" > c:\temp\reg.txt
for /f %%a in ('find /c /v "" ^< "c:\temp\reg.txt"') do set count=%%a
echo Number of lines: !count!
for /l %%i in (2,1,!count!) do (
echo Current line is: %%i
for /f "tokens=2 delims=]" %%b in ('find /n /v "" ^< "c:\temp\reg.txt" ^| findstr "^\[%%i\]"') do set test=%%b
set regstring=!test!^\Properties
echo !regstring!
for /f "tokens=3*" %%c in ('reg query !regstring! ^/v "{a45c254e-df1c-4efd-8020-67d146a850e0},2"') do set value=%%c %%d
echo !value!
)
此代码将一组注册表子项从特定键存储到reg.txt。 然后我们逐行读取这个文件for / l cycle。
答案 2 :(得分:0)
@ECHO Off
SETLOCAL ENABLEDELAYEDEXPANSION
:: %1 supplied to routine specifies the instance name
SET "myname=%1"
:: A communications area...
SET "flagdir=U:\comms"
:: Log this instance in - file "name.run"
ECHO.>"%flagdir%\%myname%.run"
:: grab hundredths-of-seconds to modify %random%
FOR /f "tokens=2delims=." %%a IN ("%time%") DO SET /a randmod=1%%a-100
:: record of other-instances-found
SET "othero="
:: Loop runs about every second
:loop
PING -n 2 127.0.0.1 >NUL
:: If the file "quit" exists, terminate
IF EXIST "%flagdir%\quit" GOTO endrun
:: look for others
SET "others="
FOR /f %%a IN ('dir/b "%flagdir%\*.run"') DO IF /i %%~na neq %myname% SET "others=!others! %%~na"
:: Report if changed
IF "%othero%" neq "%others%" CALL :report "I see %others% now"
SET "othero=%others%"
:: 2% chance of doing something...
SET /a selection=(%randmod% + (%RANDOM% %% 100)) %% 100
ECHO %selection%
IF %selection%==37 (CALL :instruct count) ELSE IF %selection%==51 (CALL :instruct repeat)
:: Do I have any instructions?
IF NOT EXIST "%flagdir%\*.%myname%" GOTO loop
:: I've been sent instructions
FOR %%i IN ("%flagdir%\*.%myname%") DO (
SET /p instruction=<"%%i"
DEL "%%i"
CALL :report "%%~ni instructs ===!instruction!==="
CALL :execute
)
GOTO loop
:endrun
DEL "%flagdir%\%myname%.run"
GOTO :EOF
:report
ECHO %TIME% %~1
GOTO :eof
:instruct
:: instruct another instance - select destination
SET /a found=0
FOR %%a IN (%othero%) DO SET /a found+=1
SET /a selection=(%RANDOM% %% %found%) + 1
FOR /f "tokens=%selection%" %%a IN ('echo %othero%') DO SET sendto=%%a
SET /a selection=4 + (%RANDOM% %% 8)
SET "line=%1 %selection%"
CALL :report "to %sendto%: %line%"
>"%flagdir%\%myname%.%sendto%" ECHO %line%
GOTO :eof
:: Instructions that may be passed
:count
FOR /l %%z IN (1,1,%1) DO ECHO count...%%z
GOTO :eof
:repeat
FOR /l %%z IN (1,1,%1) DO ECHO repeat...%1
GOTO :eof
:execute
CALL :%instruction%
GOTO :eof
这是一种方式......
从空目录(U:\ comm)开始,您可以start
批量的任意数量的实例,每个实例都有一个唯一的名称作为其第一个参数。
建立一个名为 instancename.run 的文件,以标记例程正在运行。
&#34; randmod&#34;旨在通过记录百分之一秒来修改%random%
的回报。两个批处理文件从&#34开始;相同&#34;时间将生成相同的随机数序列,但百分之一秒可能会有所不同。为了补充这一点,我将上述内容称为
start thisbatch fred&ping -n 3 127.0.0.1&start thisbatch derf&ping -n 3 127.0.0.1&start thisbatch blue&ping -n 3 127.0.0.1&start thisbatch pink
在由ping
超时控制的循环中,然后我们看看标志文件&#34;是否退出&#34;存在,如果存在,删除instancename.run
文件(并退出)
否则,查找正在运行的其他名称(* .run文件)并将others
设置为这些实例名称的列表。如果它从以前的版本更改,请报告更改(当然,这仅用于演示目的。)
然后选择一个随机数0..99,修改返回的随机数以获得同步(对于演示来说它很快且很脏。不需要准确......)
如果所选的数字是37,那么发送&#34;计数&#34; insruction到另一个实例,否则,如果它是51,发送&#34;重复&#34;指令(仅用于演示 - 每个的可能性为1%)
instruct
例程从其他实例列表中选择目的地并构建一条指令(计数/重复+随机数),该指令记录在名为 thisinstancename.destinationinstance <的文件中/ p>
然后我们检查我们是否收到了指令,如果有,我们会执行它。
两个例程count
和repeat
只是在目标实例中显示不同的东西 - 所有这些都是为了演示目的。
选择是出于安全目的而回应 - 显示循环仍在运行并显示控制目标进程的重要数字。