As Nasser notes in a comment every Symbol has a context.  You should be aware that Symbols are created during parsing.  See:  http://mathematica.stackexchange.com/q/8295/121.

Alright, now that we worked out what you want here is the simplified answer:

We can perform a similar operation to [`BeginPackage`](http://reference.wolfram.com/mathematica/ref/BeginPackage.html) with Block:

    Block[{$ContextPath = {"runPrv`", "System`"}, $Context = "runPrv`"}, . . .]

We can combine this with Leonid's method from http://mathematica.stackexchange.com/questions/595/is-it-possible-to-use-begin-and-end-inside-a-manipulate/598#598 to keep contexts from being fully resolved until we are ready for evaluation inside the `Block`.  (Note that ``Global` `` Symbols are still created, as discussed above, but they will not be defined.)  I believe ``"runPrv`"`` may be left out of `$ContextPath` in our application so long as we don't change the `$Context` from ``"runPrv`"`` within the Block itself.   Finally we have:

    SetAttributes[runPrivate, HoldAllComplete];
    
    runPrivate[code_] :=
      With[{body = MakeBoxes @ code},
        Block[{$ContextPath = {"System`"}, $Context = "runPrv`"},
          ToExpression @ body]]

Now:

    runPrivate[
      Get["test.m"];
      a = 5;
      test[a]
    ]

> 5

Global Symbols `a` and `test` remain undefined:

    ?a
    ?test

> Global`a
> 
> Global`test