2016-10-27 7 views
0

私はSAS内からスクリプトを生成しようとしています。残念ながら、私はスクリプトをファイルに書き込むにはSAS:引用問題

strMSHTA = "mshta.exe ""about:<input type=file id=FILE>" _ 
     & "<script>FILE.click();new ActiveXObject('Scripting.FileSystemObject')" _ 
     & ".GetStandardStream(1).WriteLine(FILE.value);close();resizeTo(0,0);</script>""" 

行を記述する必要が、私は、次のアプローチを使用しています:

/* write the script to file */ 
filename outfile ".\temp.vbs"; 
data _null_; 
    file outfile; 
    put 'WScript.Echo "Hello, World!"'; 
run; 

/* run the script */ 
data _null_; 
    call system(".\temp.vbs"); 
run; 

/* housekeeping */ 
%let rc=%sysfunc(fdelete(outfile)); 
%symdel rc; 
filename outfile clear; 

残念ながら、put文が&に親切に取らない、' 、および"。私はmacro quoting functionsのすべてを試しましたが、何もできません。必要に応じて、&の代わりにオーバーロードされた連結演算子+を使用できます。これを行うと、一重引用符がActiveXObject('Scripting.FileSystemObject')にあるため、中間行のエラーだけが残ります。何か案は?

答えて

1

私はこの問題を理解していません。あなたのリテラル文字列の外側に単一引用符の代わりに二重引用符を使用すると、&または%ようなマクロのトリガーを心配する必要がなくなりますが、あなたはまだあなたが生成する必要が任意のリテラル一重引用符を2倍にする必要があります。

put 
'strMSHTA = "mshta.exe ""about:<input type=file id=FILE>" _' 
/'  & "<script>FILE.click();new ActiveXObject(''Scripting.FileSystemObject'')" _' 
/'  & ".GetStandardStream(1).WriteLine(FILE.value);close();resizeTo(0,0);</script>"""' 
; 

また、文字列リテラルを複数の文字列リテラルに分割し、それぞれに異なる外側の引用符を使用することもできます。

put 
'strMSHTA = "mshta.exe ""about:<input type=file id=FILE>" _' 
/'  & "<script>FILE.click();new ActiveXObject(' 
"'Scripting.FileSystemObject'" 
')" _' 
/'  & ".GetStandardStream(1).WriteLine(FILE.value);close();resizeTo(0,0);</script>"""' 
; 
+0

ありがとうございました!私は二重一重引用符を使用して外側の一重引用符が閉じないようにすることはできません。キャリッジリターンを挿入するために '/'を使うこともできなかった。 SASのマニュアルで、どちらの説明がどこにあるのかわかりますか? –

+0

PUT文のマニュアルページを見てください。ラインポインタコントロールのセクションを見てください。 SAS言語の単語のコンセプトページを探します。 http://support.sas.com/documentation/cdl/en/lrcon/68089/HTML/default/viewer.htm#p1qge1g4ytqq41n1e8x8s7ugmyst.htm – Tom