Toplu İş: Verileri yeni CMD örneğine bağımsız değişken olarak iletme


1

Başka bir CMD örneğini aramak ve ana örneğinden veri iletmek istiyorum.

Genel değişkenleri kullanma yolunun farkındayım, ancak bu durumda bu mümkün olmayacaktı çünkü endlocal ve köprüleme çok fazla sıkıntı yaratacaktı (onlarca değişkeni iletmek zorunda kalacaktı). Ayrıca, kolayca istediğim tüm verileri taşımak için geçici dosyaları kullanabileceğimi biliyorum, ancak bu istenmeyen ayak izlerini bırakacaktır. EDIT: setx oldukça başarılı bir şekilde kullanılabilir.

Özellikle argümanların ortak kullanım alanları boyunca bir şey arıyorum :

test.bat -setvar"variable"="value" -setvar...

Daha önce sınırlamaları olan bir yol buldum

Diğer iş parçacığı üzerinde start cmd sonuna bir komut ekleyebilir öğrendim

start cmd /c call "test.bat" ^& PAUSE

Elbette bunu tersine çevirebiliriz.

start cmd /c call PAUSE ^& TIMEOUT 5 ^& PAUSE ^& test.bat

Komutlar "" olamaz ve şüpheli özel karakterler olabilir. Bu karmaşık değişkenleri taşımaya çalışırken bir sorun sunar.

Özel karakterlerden bahsetmek:

start cmd /c call (PAUSE) ^& (TIMEOUT 5) ^& (REM !"#¤%&/=?`´^*"-.,_:;\*~¨) ^& test.bat

Bu hiç işe yaramayacak. Yorumdan kaçabilirim, ancak bazı değişkenler durumunda, elimden gelen herhangi bir şeyde işleyebilecek değerlerin yeterli olduğunu bilme lüksüne sahip olamayabilirim. - Aslında parantez içinde hoş görülmüyor.

Yapmam gereken en önemli şeylerden biri, kolayca elde edilebilecek hacim isimlerini geçmek, ancak bu yeterli değil.

start cmd /c call echo \\?\Volume{6537febd-01bc-11d6-adb5-806e6f6e6963}\ ^& TIMEOUT 5 ^& PAUSE ^& test.bat

Bu zaten başka bir yerde ele alınabilir ve eğer öyleyse, sorun ilgili konulara doğru anahtar kelimeleri veya paralelleri bulamam.


1
Ve setxdeğişkeninizi saklayabileceğiniz global bir değişken oluşturan komutu kullanamamanızın bir nedeni var, böylece onu diğer rutinden geri okuyabilirsiniz?
LPChip

İyi bir nokta, hatırladığım kadarıyla, CMD'nin sahip olamayacağı idari ayrıcalıklar (HKLM hakkına yazma?) Gerekeceğini hatırlıyorum. Başka bir komut dosyası için olası bir çözüm, evet, daha önce bahsettiğim seçenekler gibi, fakat aradığım şey değil.
Alex Oja

1
Hayır, bir kullanıcı her zaman yazacağı HK_CU'ya setx "name" "variable"yazabilir, böylece / M belirtmediğiniz sürece cmd'yi yönetici ayrıcalıklarıyla çalıştırmanız gerekmez, sonra HK_LM'ye yazar ve sonra yönetici ayrıcalıklarına ihtiyacınız vardır. Ama istediğin şey için, bu gerekli değil. Önceden atanmış bir değişkeni silmek için setx "name" ""Ayrıca, setx değişkenlerinin mevcut oturumda, sadece bir sonraki oturumda çalışmadığını unutmayın. setGeçerli oturum için kullanın .
LPChip

Açıkçası setx'in işlevini yanlış anladım, sonra ss64'e döndüm. Bunu temizlediğin için teşekkürler!
Alex Oja

1
Bu, artık yardıma ihtiyacınız olmadığı anlamına mı geliyor? Öyleyse soruyu kabul etmek ve belirlediğiniz herkese bildirmek için size kısa bir cevap yazacağım. :)
LPChip

Yanıtlar:


2

Bir alt cmdörnek, tüm ortam değişkenlerini üst öğeden devralır . Kanıt: İki toplu komut dosyası hazırlayalım:

Test1.bat

@setlocal
@set _batch
@set "_batchParentName=%~nx0"
@set "_batchParentPath=%~dp0"
@set "_batchParentSpec=< LSS > GTR & amper | pipe"
start "%~n0" cmd /C call "test.bat" "%_batchParentSpec%" %* ^& pause
@set _batch

test.bat

@setlocal
@set _batch
@echo %~n0: %%* = %*

Ana cmdörnek çıkışı:

d:\bat>test1.bat first "1<2" third
Environment variable _batch not defined

d:\bat>start "test1" cmd /C call "test.bat" "< LSS > GTR & amper | pipe" first "1<2" third
 & pause
_batchParentName=test1.bat
_batchParentPath=D:\bat\
_batchParentSpec=< LSS > GTR & amper | pipe

d:\bat>

Alt cmdörnek çıktısı test.bat:

_batchParentName=test1.bat
_batchParentPath=D:\bat\
_batchParentSpec=< LSS > GTR & amper | pipe
test: %* = "< LSS > GTR & amper | pipe" first "1<2" third
Press any key to continue . . .

Sağ startkomut sözdizimini aşağıdakilerle not edin "title":

START "title" [/D path] [options] "command" [parameters]

Her zaman bir TITLE ekleyin, bu "Komut Dosyam" gibi basit bir dize veya sadece bir çift boş tırnak "" olabilir. Microsoft belgelerine göre, başlık isteğe bağlıdır, ancak seçilen diğer seçeneklere bağlı olarak, belirtilmezse sorun yaşayabilirsiniz.

Emin olunstart komutunu vermez içerirler /I(dan seçeneği anahtarı start /?):

 /I      The new environment will be the original environment passed
         to the cmd.exe and not the current environment.

Alt ortam değişikliklerinin başka bir olasılığını ortadan kaldırmak /Diçin cmd, aşağıdaki gibi geçiş yapın :

start "test1" cmd /D /C call "test.bat"

Başına cmd /?:

/D      Disable execution of AutoRun commands from registry

1

setxPencerelerinize genel olan çevresel bir değişken ayarlamak için kullanabilirsiniz .

Kullanmak için setxsadece bu yazın: setx "name" "variable"adı basit bir adıdır ve değişken ayarlamak istediğiniz bir değişkendir.

setx /?Seçeneklere biraz daha inmek istemeniz durumunda tüm seçenek ve parametrelere bakın .

Bununla birlikte, setx değişkenleri doğrudan mevcut kullanıcının kayıt defteri kovanına kaydedecektir. Bu, herhangi bir idari ayrıcalıklara ihtiyacınız olmadığı anlamına gelir, ancak aynı zamanda değişkenlerin geçerli cmd oturumunda doğrudan kullanılamadığı anlamına gelir. Düzenli kullanım setsadece yerel olarak değişkenleri saklamak istiyorum.

Tabii ki, aşağıdaki örnekte gösterildiği gibi global değişkene yerel bir değişken de kaydedebilirsiniz:

@echo off
:: store "test" in variable "a"
set a=test

:: make this variable global
setx a %a%

Yukarıdaki örnekte görebileceğiniz gibi %a%, yerel kapsamdaki değişkene atıfta bulunulur ve setx bunu genel olarak erişilebilir kılar

Genel bir değişkeni kaldırmak için bu komutu arayın: setx "name" ""örneğin:setx a ""

Ayrıca farkına varmak iyi: bir sette başka bir set kullanarak cmd'nin bir örneğini değiştiremezsiniz. Bir cmd penceresi başlattığınız anda sadece set içindeki değişkenleri değiştirebilir ve setx onları dışarıda saklayabilir. (istediğiniz gibi çıktıktan sonra)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.